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