diff --git a/.changeset/loose-baboons-visit.md b/.changeset/loose-baboons-visit.md
new file mode 100644
index 0000000000..09c50deb5e
--- /dev/null
+++ b/.changeset/loose-baboons-visit.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: emit state_referenced_locally warning for non-destructured props
diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js
index 9daae33dd7..5c1e8031b8 100644
--- a/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js
+++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js
@@ -115,7 +115,8 @@ export function Identifier(node, context) {
!should_proxy(binding.initial.arguments[0], context.state.scope)))) ||
binding.kind === 'raw_state' ||
binding.kind === 'derived' ||
- binding.kind === 'prop') &&
+ binding.kind === 'prop' ||
+ binding.kind === 'rest_prop') &&
// We're only concerned with reads here
(parent.type !== 'AssignmentExpression' || parent.left !== node) &&
parent.type !== 'UpdateExpression'
diff --git a/packages/svelte/tests/snapshot/samples/props-identifier/_expected/client/index.svelte.warnings.json b/packages/svelte/tests/snapshot/samples/props-identifier/_expected/client/index.svelte.warnings.json
new file mode 100644
index 0000000000..81149a92f8
--- /dev/null
+++ b/packages/svelte/tests/snapshot/samples/props-identifier/_expected/client/index.svelte.warnings.json
@@ -0,0 +1,142 @@
+[
+ {
+ "code": "state_referenced_locally",
+ "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?\nhttps://svelte.dev/e/state_referenced_locally",
+ "filename": "packages/svelte/tests/snapshot/samples/props-identifier/index.svelte",
+ "start": {
+ "line": 3,
+ "column": 1,
+ "character": 33
+ },
+ "end": {
+ "line": 3,
+ "column": 6,
+ "character": 38
+ },
+ "position": [
+ 33,
+ 38
+ ],
+ "frame": "1: "
+ },
+ {
+ "code": "state_referenced_locally",
+ "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?\nhttps://svelte.dev/e/state_referenced_locally",
+ "filename": "packages/svelte/tests/snapshot/samples/props-identifier/index.svelte",
+ "start": {
+ "line": 9,
+ "column": 1,
+ "character": 120
+ },
+ "end": {
+ "line": 9,
+ "column": 6,
+ "character": 125
+ },
+ "position": [
+ 120,
+ 125
+ ],
+ "frame": " 7: props.a = true;\n 8: props[a] = true;\n 9: props;\n ^\n10: \n11: "
+ }
+]
\ No newline at end of file
diff --git a/packages/svelte/tests/snapshot/samples/props-identifier/_expected/server/index.svelte.warnings.json b/packages/svelte/tests/snapshot/samples/props-identifier/_expected/server/index.svelte.warnings.json
new file mode 100644
index 0000000000..81149a92f8
--- /dev/null
+++ b/packages/svelte/tests/snapshot/samples/props-identifier/_expected/server/index.svelte.warnings.json
@@ -0,0 +1,142 @@
+[
+ {
+ "code": "state_referenced_locally",
+ "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?\nhttps://svelte.dev/e/state_referenced_locally",
+ "filename": "packages/svelte/tests/snapshot/samples/props-identifier/index.svelte",
+ "start": {
+ "line": 3,
+ "column": 1,
+ "character": 33
+ },
+ "end": {
+ "line": 3,
+ "column": 6,
+ "character": 38
+ },
+ "position": [
+ 33,
+ 38
+ ],
+ "frame": "1: "
+ },
+ {
+ "code": "state_referenced_locally",
+ "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?\nhttps://svelte.dev/e/state_referenced_locally",
+ "filename": "packages/svelte/tests/snapshot/samples/props-identifier/index.svelte",
+ "start": {
+ "line": 9,
+ "column": 1,
+ "character": 120
+ },
+ "end": {
+ "line": 9,
+ "column": 6,
+ "character": 125
+ },
+ "position": [
+ 120,
+ 125
+ ],
+ "frame": " 7: props.a = true;\n 8: props[a] = true;\n 9: props;\n ^\n10: \n11: "
+ }
+]
\ No newline at end of file
diff --git a/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/input.svelte b/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/input.svelte
new file mode 100644
index 0000000000..980debdfaf
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/input.svelte
@@ -0,0 +1,6 @@
+
diff --git a/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/warnings.json b/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/warnings.json
new file mode 100644
index 0000000000..b1385037e1
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/warnings.json
@@ -0,0 +1,26 @@
+[
+ {
+ "code": "state_referenced_locally",
+ "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?",
+ "start": {
+ "line": 3,
+ "column": 19
+ },
+ "end": {
+ "line": 3,
+ "column": 24
+ }
+ },
+ {
+ "code": "state_referenced_locally",
+ "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?",
+ "start": {
+ "line": 4,
+ "column": 15
+ },
+ "end": {
+ "line": 4,
+ "column": 20
+ }
+ }
+]