From 0367ddf7894bc1b42a060bac546aecd6660190a2 Mon Sep 17 00:00:00 2001
From: Eduardo San Martin Morote <posva13@gmail.com>
Date: Wed, 2 Jun 2021 14:13:47 +0200
Subject: [PATCH 1/2] fix(v-slot): fix scoped slot normalization combined with
 v-if

Fix #12102
---
 src/core/vdom/helpers/normalize-scoped-slots.js    |  2 +-
 .../unit/features/component/component-slot.spec.js | 14 ++++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/core/vdom/helpers/normalize-scoped-slots.js b/src/core/vdom/helpers/normalize-scoped-slots.js
index 15ab396d209..8001aae503d 100644
--- a/src/core/vdom/helpers/normalize-scoped-slots.js
+++ b/src/core/vdom/helpers/normalize-scoped-slots.js
@@ -64,7 +64,7 @@ function normalizeScopedSlot(normalSlots, key, fn) {
     let vnode: VNode = res && res[0]
     return res && (
       !vnode ||
-      (vnode.isComment && !isAsyncPlaceholder(vnode)) // #9658, #10391
+      (res.length === 1 && vnode.isComment && !isAsyncPlaceholder(vnode)) // #9658, #10391
     ) ? undefined
       : res
   }
diff --git a/test/unit/features/component/component-slot.spec.js b/test/unit/features/component/component-slot.spec.js
index c6e20e49749..4412a1f0c7d 100644
--- a/test/unit/features/component/component-slot.spec.js
+++ b/test/unit/features/component/component-slot.spec.js
@@ -986,4 +986,18 @@ describe('Component slot', () => {
       expect(vm.$el.firstChild.innerHTML).toBe('<span><b>2</b></span>')
     }).then(done)
   })
+
+  // #12102
+  it('v-if inside scoped slot', () => {
+    const vm = new Vue({
+      template: `<test><template #custom><span v-if="false">a</span><span>b</span></template></test>`,
+      components: {
+        test: {
+          template: `<div><slot name="custom"/></div>`
+        }
+      }
+    }).$mount()
+
+    expect(vm.$el.innerHTML).toBe(`<!----><span>b</span>`)
+  })
 })

From 878ec6eb7f1828c9b4838801e82e13efc0b5bba9 Mon Sep 17 00:00:00 2001
From: Eduardo San Martin Morote <posva13@gmail.com>
Date: Wed, 2 Jun 2021 14:27:26 +0200
Subject: [PATCH 2/2] types: maybe type

---
 src/core/vdom/helpers/normalize-scoped-slots.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/core/vdom/helpers/normalize-scoped-slots.js b/src/core/vdom/helpers/normalize-scoped-slots.js
index 8001aae503d..13df231f43c 100644
--- a/src/core/vdom/helpers/normalize-scoped-slots.js
+++ b/src/core/vdom/helpers/normalize-scoped-slots.js
@@ -61,7 +61,7 @@ function normalizeScopedSlot(normalSlots, key, fn) {
     res = res && typeof res === 'object' && !Array.isArray(res)
       ? [res] // single vnode
       : normalizeChildren(res)
-    let vnode: VNode = res && res[0]
+    let vnode: ?VNode = res && res[0]
     return res && (
       !vnode ||
       (res.length === 1 && vnode.isComment && !isAsyncPlaceholder(vnode)) // #9658, #10391