diff --git a/.changeset/gorgeous-jeans-begin.md b/.changeset/gorgeous-jeans-begin.md
new file mode 100644
index 0000000000..586c4d8a57
--- /dev/null
+++ b/.changeset/gorgeous-jeans-begin.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: always mark props as stateful
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 cced326f9b..4dfdfe5af1 100644
--- a/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js
+++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js
@@ -93,7 +93,10 @@ export function Identifier(node, context) {
context.state.expression.references.add(binding);
context.state.expression.has_state ||=
binding.kind !== 'static' &&
- !binding.is_function() &&
+ (binding.kind === 'prop' ||
+ binding.kind === 'bindable_prop' ||
+ binding.kind === 'rest_prop' ||
+ !binding.is_function()) &&
!context.state.scope.evaluate(node).is_known;
}
diff --git a/packages/svelte/tests/runtime-runes/samples/props-default-value-function/_config.js b/packages/svelte/tests/runtime-runes/samples/props-default-value-function/_config.js
new file mode 100644
index 0000000000..6b281f04f0
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/props-default-value-function/_config.js
@@ -0,0 +1,15 @@
+import { flushSync } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ mode: ['client'],
+
+ test({ assert, target }) {
+ const btn = target.querySelector('button');
+
+ assert.htmlEqual(target.innerHTML, ` Inner: 0 Inner: 0`);
+ btn?.click();
+ flushSync();
+ assert.htmlEqual(target.innerHTML, ` Inner: 1 Inner: 1`);
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/props-default-value-function/inner.svelte b/packages/svelte/tests/runtime-runes/samples/props-default-value-function/inner.svelte
new file mode 100644
index 0000000000..6bde0a15a8
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/props-default-value-function/inner.svelte
@@ -0,0 +1,4 @@
+
+Inner: {getter()}
diff --git a/packages/svelte/tests/runtime-runes/samples/props-default-value-function/main.svelte b/packages/svelte/tests/runtime-runes/samples/props-default-value-function/main.svelte
new file mode 100644
index 0000000000..2cb2f67b82
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/props-default-value-function/main.svelte
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/svelte/tests/runtime-runes/samples/props-default-value-function/wrapper.svelte b/packages/svelte/tests/runtime-runes/samples/props-default-value-function/wrapper.svelte
new file mode 100644
index 0000000000..525494ddfb
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/props-default-value-function/wrapper.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/packages/svelte/tests/runtime-runes/samples/props-default-value-function/wrapper2.svelte b/packages/svelte/tests/runtime-runes/samples/props-default-value-function/wrapper2.svelte
new file mode 100644
index 0000000000..9498f432d8
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/props-default-value-function/wrapper2.svelte
@@ -0,0 +1,7 @@
+
+
+