r175116 - When marking derived classes' virtual methods ODR-used in order to trigger
Nick Lewycky
nicholas at mxc.ca
Wed Feb 13 16:55:18 PST 2013
Author: nicholas
Date: Wed Feb 13 18:55:17 2013
New Revision: 175116
URL: http://llvm.org/viewvc/llvm-project?rev=175116&view=rev
Log:
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.
Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
cfe/trunk/test/SemaCXX/undefined-internal.cpp
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=175116&r1=175115&r2=175116&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Feb 13 18:55:17 2013
@@ -11179,7 +11179,7 @@ static void MarkExprReferenced(Sema &Sem
if (!MostDerivedClassDecl)
return;
CXXMethodDecl *DM = MD->getCorrespondingMethodInClass(MostDerivedClassDecl);
- if (!DM)
+ if (!DM || DM->isPure())
return;
SemaRef.MarkAnyDeclReferenced(Loc, DM, OdrUse);
}
Modified: cfe/trunk/test/SemaCXX/undefined-internal.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/undefined-internal.cpp?rev=175116&r1=175115&r2=175116&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/undefined-internal.cpp (original)
+++ cfe/trunk/test/SemaCXX/undefined-internal.cpp Wed Feb 13 18:55:17 2013
@@ -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();
+ }
+ };
+ }
+}
+
More information about the cfe-commits
mailing list