diff --git a/src/core/vdom/create-element.js b/src/core/vdom/create-element.js
index ba36e15b12..bc81aa2b89 100644
--- a/src/core/vdom/create-element.js
+++ b/src/core/vdom/create-element.js
@@ -98,7 +98,7 @@ export function _createElement (
ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag)
if (config.isReservedTag(tag)) {
// platform built-in elements
- if (process.env.NODE_ENV !== 'production' && isDef(data) && isDef(data.nativeOn)) {
+ if (process.env.NODE_ENV !== 'production' && isDef(data) && isDef(data.nativeOn) && data.tag !== 'component') {
warn(
`The .native modifier for v-on is only valid on components but it was used on <${tag}>.`,
context
diff --git a/test/unit/features/directives/on.spec.js b/test/unit/features/directives/on.spec.js
index 5e755a34f8..95693c199f 100644
--- a/test/unit/features/directives/on.spec.js
+++ b/test/unit/features/directives/on.spec.js
@@ -474,6 +474,20 @@ describe('Directive v-on', () => {
expect(spy.calls.count()).toBe(0)
})
+ it('should not throw a warning if native modifier is used on a dynamic component', () => {
+ vm = new Vue({
+ el,
+ template: `
+