diff --git a/src/compiler/error-detector.js b/src/compiler/error-detector.js
index 22c3b75d..9893aa4a 100644
--- a/src/compiler/error-detector.js
+++ b/src/compiler/error-detector.js
@@ -36,6 +36,8 @@ function checkNode (node: ASTNode, warn: Function) {
const range = node.rawAttrsMap[name]
if (name === 'v-for') {
checkFor(node, `v-for="${value}"`, warn, range)
+ } else if (name === 'v-slot' || name[0] === '#') {
+ checkFunctionParameterExpression(value, `${name}="${value}"`, warn, range)
} else if (onRE.test(name)) {
checkEvent(value, `${name}="${value}"`, warn, range)
} else {
@@ -111,3 +113,16 @@ function checkExpression (exp: string, text: string, warn: Function, range?: Ran
}
}
}
+
+function checkFunctionParameterExpression (exp: string, text: string, warn: Function, range?: Range) {
+ try {
+ new Function(exp, '')
+ } catch (e) {
+ warn(
+ `invalid function parameter expression: ${e.message} in\n\n` +
+ ` ${exp}\n\n` +
+ ` Raw expression: ${text.trim()}\n`,
+ range
+ )
+ }
+}
diff --git a/src/compiler/parser/index.js b/src/compiler/parser/index.js
index fb258752..cdeb257e 100644
--- a/src/compiler/parser/index.js
+++ b/src/compiler/parser/index.js
@@ -23,8 +23,8 @@ import {
export const onRE = /^@|^v-on:/
export const dirRE = process.env.VBIND_PROP_SHORTHAND
- ? /^v-|^@|^:|^\./
- : /^v-|^@|^:/
+ ? /^v-|^@|^:|^\.|^#/
+ : /^v-|^@|^:|^#/
export const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/
export const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/
const stripParensRE = /^\(|\)$/g
diff --git a/test/unit/features/component/component-scoped-slot.spec.js b/test/unit/features/component/component-scoped-slot.spec.js
index f8a0f11b..28369814 100644
--- a/test/unit/features/component/component-scoped-slot.spec.js
+++ b/test/unit/features/component/component-scoped-slot.spec.js
@@ -759,6 +759,22 @@ describe('Component scoped slot', () => {
}).$mount()
expect(`Unexpected mixed usage of different slot syntaxes`).toHaveBeenWarned()
})
+
+ it('should warn invalid parameter expression', () => {
+ new Vue({
+ template: ``,
+ components: { Foo }
+ }).$mount();
+ expect('invalid function parameter expression').toHaveBeenWarned()
+ })
+
+ it('should allow destructuring props with default value', () => {
+ new Vue({
+ template: ``,
+ components: { Foo }
+ }).$mount();
+ expect('invalid function parameter expression').not.toHaveBeenWarned()
+ })
}
// run tests for both full syntax and shorthand