diff --git a/.changeset/fresh-trains-doubt.md b/.changeset/fresh-trains-doubt.md
new file mode 100644
index 0000000000..5e68fd93fc
--- /dev/null
+++ b/.changeset/fresh-trains-doubt.md
@@ -0,0 +1,5 @@
+---
+"svelte": patch
+---
+
+fix: warn when bare `
` is used in a component
diff --git a/documentation/docs/98-reference/.generated/compile-warnings.md b/documentation/docs/98-reference/.generated/compile-warnings.md
index f372a010a5..42797f5749 100644
--- a/documentation/docs/98-reference/.generated/compile-warnings.md
+++ b/documentation/docs/98-reference/.generated/compile-warnings.md
@@ -982,6 +982,12 @@ A derived value may be used in other contexts:
See [the note in the docs](legacy-svelte-self) for more info.
+### unexpected_head
+
+```
+Using `` (%location%) will likely lead to runtime errors. Use [``](https://svelte.dev/docs/svelte/svelte-head) instead
+```
+
### unknown_code
```
diff --git a/packages/svelte/messages/compile-warnings/template.md b/packages/svelte/messages/compile-warnings/template.md
index f1e32a6d18..2a1bcc8933 100644
--- a/packages/svelte/messages/compile-warnings/template.md
+++ b/packages/svelte/messages/compile-warnings/template.md
@@ -159,3 +159,7 @@ A derived value may be used in other contexts:
> `` is deprecated — use self-imports (e.g. `import %name% from './%basename%'`) instead
See [the note in the docs](legacy-svelte-self) for more info.
+
+## unexpected_head
+
+> Using `` (%location%) will likely lead to runtime errors. Use [``](https://svelte.dev/docs/svelte/svelte-head) instead
diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js
index bc65bd65db..d213f5e43a 100644
--- a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js
+++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js
@@ -17,7 +17,7 @@ import { check_element } from './shared/a11y/index.js';
import { validate_element } from './shared/element.js';
import { mark_subtree_dynamic } from './shared/fragment.js';
import { object } from '../../../utils/ast.js';
-import { runes } from '../../../state.js';
+import { component_name, filename, locate_node, locator, runes } from '../../../state.js';
/**
* @param {AST.RegularElement} node
@@ -126,6 +126,10 @@ export function RegularElement(node, context) {
w.component_name_lowercase(node, node.name);
}
+ if (node.name === 'head' && !context.state.parent_element) {
+ w.unexpected_head(node, locate_node(node));
+ }
+
node.metadata.has_spread = node.attributes.some(
(attribute) => attribute.type === 'SpreadAttribute'
);
diff --git a/packages/svelte/src/compiler/warnings.js b/packages/svelte/src/compiler/warnings.js
index 98f407671d..9b47ec8273 100644
--- a/packages/svelte/src/compiler/warnings.js
+++ b/packages/svelte/src/compiler/warnings.js
@@ -119,7 +119,8 @@ export const codes = [
'slot_element_deprecated',
'svelte_component_deprecated',
'svelte_element_invalid_this',
- 'svelte_self_deprecated'
+ 'svelte_self_deprecated',
+ 'unexpected_head'
];
/**
@@ -843,4 +844,13 @@ export function svelte_element_invalid_this(node) {
*/
export function svelte_self_deprecated(node, name, basename) {
w(node, 'svelte_self_deprecated', `\`\` is deprecated — use self-imports (e.g. \`import ${name} from './${basename}'\`) instead\nhttps://svelte.dev/e/svelte_self_deprecated`);
+}
+
+/**
+ * Using `` (%location%) will likely lead to runtime errors. Use [``](https://svelte.dev/docs/svelte/svelte-head) instead
+ * @param {null | NodeLike} node
+ * @param {string} location
+ */
+export function unexpected_head(node, location) {
+ w(node, 'unexpected_head', `Using \`\` (${location}) will likely lead to runtime errors. Use [\`\`](https://svelte.dev/docs/svelte/svelte-head) instead\nhttps://svelte.dev/e/unexpected_head`);
}
\ No newline at end of file
diff --git a/packages/svelte/tests/validator/samples/naked-head/input.svelte b/packages/svelte/tests/validator/samples/naked-head/input.svelte
new file mode 100644
index 0000000000..601ca34d65
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/naked-head/input.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/packages/svelte/tests/validator/samples/naked-head/warnings.json b/packages/svelte/tests/validator/samples/naked-head/warnings.json
new file mode 100644
index 0000000000..9820233a88
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/naked-head/warnings.json
@@ -0,0 +1,14 @@
+[
+ {
+ "code": "unexpected_head",
+ "message": "Using `` ((unknown):1:0) will likely lead to runtime errors. Use [``](https://svelte.dev/docs/svelte/svelte-head) instead",
+ "start": {
+ "line": 1,
+ "column": 0
+ },
+ "end": {
+ "line": 3,
+ "column": 7
+ }
+ }
+]