diff --git a/src/compiler/parser/html-parser.js b/src/compiler/parser/html-parser.js
index dbc59146331..37c1fa24d58 100644
--- a/src/compiler/parser/html-parser.js
+++ b/src/compiler/parser/html-parser.js
@@ -15,7 +15,7 @@ import { unicodeRegExp } from 'core/util/lang'
// Regular Expressions for parsing tags and attributes
const attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
-const dynamicArgAttribute = /^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
+const dynamicArgAttribute = /^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
const ncname = `[a-zA-Z_][\\-\\.0-9_a-zA-Z${unicodeRegExp.source}]*`
const qnameCapture = `((?:${ncname}\\:)?${ncname})`
const startTagOpen = new RegExp(`^<${qnameCapture}`)
diff --git a/test/unit/modules/compiler/parser.spec.js b/test/unit/modules/compiler/parser.spec.js
index d6521bbf625..360bc11bbb6 100644
--- a/test/unit/modules/compiler/parser.spec.js
+++ b/test/unit/modules/compiler/parser.spec.js
@@ -569,6 +569,26 @@ describe('parser', () => {
})
})
+ // #9781
+ it('multiple dynamic slot names without warning', () => {
+ const ast = parse(`
+ foo
+ scope
+ bar
+ `, baseOptions)
+
+ expect(`Invalid dynamic argument expression`).not.toHaveBeenWarned()
+ expect(ast.scopedSlots.foo).not.toBeUndefined()
+ expect(ast.scopedSlots.data).not.toBeUndefined()
+ expect(ast.scopedSlots.bar).not.toBeUndefined()
+ expect(ast.scopedSlots.foo.type).toBe(1)
+ expect(ast.scopedSlots.data.type).toBe(1)
+ expect(ast.scopedSlots.bar.type).toBe(1)
+ expect(ast.scopedSlots.foo.attrsMap['#[foo]']).toBe('')
+ expect(ast.scopedSlots.bar.attrsMap['#[bar]']).toBe('')
+ expect(ast.scopedSlots.data.attrsMap['#[data]']).toBe('scope')
+ })
+
// #6887
it('special case static attribute that must be props', () => {
const ast = parse('', baseOptions)