From b7444cd11ef1f688d91f0970f2615177af63916f Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Thu, 14 Feb 2013 00:55:17 +0000 Subject: [PATCH] When marking derived classes' virtual methods ODR-used in order to trigger instantiation in order to permit devirtualization later in codegen, skip over pure functions since those can't be devirtualization targets. llvm-svn: 175116 --- clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/SemaCXX/undefined-internal.cpp | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 191683d33dba..b3ba2dc4ae92 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -11179,7 +11179,7 @@ static void MarkExprReferenced(Sema &SemaRef, SourceLocation Loc, if (!MostDerivedClassDecl) return; CXXMethodDecl *DM = MD->getCorrespondingMethodInClass(MostDerivedClassDecl); - if (!DM) + if (!DM || DM->isPure()) return; SemaRef.MarkAnyDeclReferenced(Loc, DM, OdrUse); } diff --git a/clang/test/SemaCXX/undefined-internal.cpp b/clang/test/SemaCXX/undefined-internal.cpp index e8810adadfa5..839fdafb3418 100644 --- a/clang/test/SemaCXX/undefined-internal.cpp +++ b/clang/test/SemaCXX/undefined-internal.cpp @@ -306,3 +306,20 @@ namespace test12 { Cls2 obj1((T7())); // expected-note {{used here}} } } + +namespace test13 { + namespace { + struct X { + virtual void f() { } + }; + + struct Y : public X { + virtual void f() = 0; + + virtual void g() { + X::f(); + } + }; + } +} +