diff --git a/CHANGELOG.md b/CHANGELOG.md
index fd590c71aa..6eda8563c2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
## Unreleased
* In SSR mode, do not automatically declare variables for reactive assignments to member expressions ([#5247](https://github.com/sveltejs/svelte/issues/5247))
+* Fix using ``s in child `{#await}`/`{#each}` contexts ([#5255](https://github.com/sveltejs/svelte/issues/5255))
## 3.24.1
diff --git a/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts b/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts
index 814f365a84..904cfa3329 100644
--- a/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts
+++ b/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts
@@ -17,6 +17,7 @@ import { Node, Identifier, ObjectExpression } from 'estree';
import EventHandler from '../Element/EventHandler';
import { extract_names } from 'periscopic';
import mark_each_block_bindings from '../shared/mark_each_block_bindings';
+import { string_to_member_expression } from '../../../utils/string_to_member_expression';
export default class InlineComponentWrapper extends Wrapper {
var: Identifier;
@@ -484,7 +485,7 @@ export default class InlineComponentWrapper extends Wrapper {
} else {
const expression = this.node.name === 'svelte:self'
? component.name
- : this.renderer.reference(this.node.name);
+ : this.renderer.reference(string_to_member_expression(this.node.name));
block.chunks.init.push(b`
${(this.node.attributes.length > 0 || this.node.bindings.length > 0) && b`
diff --git a/src/compiler/compile/utils/string_to_member_expression.ts b/src/compiler/compile/utils/string_to_member_expression.ts
new file mode 100644
index 0000000000..553c1371bd
--- /dev/null
+++ b/src/compiler/compile/utils/string_to_member_expression.ts
@@ -0,0 +1,17 @@
+import { MemberExpression, Identifier } from "estree";
+
+export function string_to_member_expression(name: string) {
+ const parts = name.split(".");
+ let node: MemberExpression | Identifier = {
+ type: "Identifier",
+ name: parts[0],
+ };
+ for (let i = 1; i < parts.length; i++) {
+ node = {
+ type: "MemberExpression",
+ object: node,
+ property: { type: "Identifier", name: parts[i] },
+ } as MemberExpression;
+ }
+ return node;
+}
diff --git a/test/runtime/samples/component-namespace/Tooltip.svelte b/test/runtime/samples/component-namespace/Tooltip.svelte
new file mode 100644
index 0000000000..9b44ef57a8
--- /dev/null
+++ b/test/runtime/samples/component-namespace/Tooltip.svelte
@@ -0,0 +1 @@
+
i am a widget
\ No newline at end of file
diff --git a/test/runtime/samples/component-namespace/Widget.svelte b/test/runtime/samples/component-namespace/Widget.svelte
new file mode 100644
index 0000000000..b6aa45c6a8
--- /dev/null
+++ b/test/runtime/samples/component-namespace/Widget.svelte
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/test/runtime/samples/component-namespace/_config.js b/test/runtime/samples/component-namespace/_config.js
new file mode 100644
index 0000000000..5b96ac8df0
--- /dev/null
+++ b/test/runtime/samples/component-namespace/_config.js
@@ -0,0 +1,3 @@
+export default {
+ html: 'i am a widget
'
+};
diff --git a/test/runtime/samples/component-namespace/main.svelte b/test/runtime/samples/component-namespace/main.svelte
new file mode 100644
index 0000000000..3f53b2b1c8
--- /dev/null
+++ b/test/runtime/samples/component-namespace/main.svelte
@@ -0,0 +1,8 @@
+
+
+{#each widgets as LazyWidget}
+
+{/each}
\ No newline at end of file