diff --git a/packages/compiler-sfc/__tests__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts
index 1a48a8f8ebe..08d404b9c16 100644
--- a/packages/compiler-sfc/__tests__/compileScript.spec.ts
+++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts
@@ -461,6 +461,19 @@ defineExpose({ foo: 123 })
expect(content).toMatch(`return { a, b, Baz }`)
assertCode(content)
})
+
+ // vuejs/vue#12591
+ test('v-on inline statement', () => {
+ // should not error
+ compile(`
+
+
+
+
+ `)
+ })
})
describe('inlineTemplate mode', () => {
diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts
index 58eff6868d7..5a77e8a9463 100644
--- a/packages/compiler-sfc/src/compileScript.ts
+++ b/packages/compiler-sfc/src/compileScript.ts
@@ -2134,6 +2134,8 @@ function processExp(exp: string, dir?: string): string {
if (/ as\s+\w|<.*>|:/.test(exp)) {
if (dir === 'slot') {
exp = `(${exp})=>{}`
+ } else if (dir === 'on') {
+ exp = `()=>{${exp}}`
} else if (dir === 'for') {
const inMatch = exp.match(forAliasRE)
if (inMatch) {