]> granicus.if.org Git - clang/commitdiff
Add name mangling for DeclRefExprs that refer to external names
authorDouglas Gregor <dgregor@apple.com>
Sun, 28 Feb 2010 21:40:32 +0000 (21:40 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sun, 28 Feb 2010 21:40:32 +0000 (21:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97418 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/Mangle.cpp
test/CodeGenCXX/mangle-template.cpp

index 22dbd91259c05f04e7a854b8a8a4143b25fa6efe..55185cb92d075e04e6473387c49f6ef47033e117 100644 (file)
@@ -1346,10 +1346,16 @@ void CXXNameMangler::mangleExpression(const Expr *E) {
     break;
 
   case Expr::DeclRefExprClass: {
-    const Decl *D = cast<DeclRefExpr>(E)->getDecl();
+    const NamedDecl *D = cast<DeclRefExpr>(E)->getDecl();
 
     switch (D->getKind()) {
-    default: assert(false && "Unhandled decl kind!");
+    default: 
+      //  <expr-primary> ::= L <mangled-name> E # external name
+      Out << 'L';
+      mangle(D, "_Z");
+      Out << 'E';
+      break;
+
     case Decl::NonTypeTemplateParm: {
       const NonTypeTemplateParmDecl *PD = cast<NonTypeTemplateParmDecl>(D);
       mangleTemplateParameter(PD->getIndex());
index c8296f3c4bd7a03c6c4d306a8fd6e917ba56ff0d..38b4bfa38a6e769b85a160c6acd386fcb3af2112 100644 (file)
@@ -1,5 +1,4 @@
 // RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
-
 namespace test1 {
 int x;
 template <int& D> class T { };
@@ -66,3 +65,23 @@ template <void(A::*)(float)> class T { };
 // CHECK-FAIL: void @_ZN5test62f0ENS_1TIXadL_ZNS_1A3im0EfEEEE(
 void f0(T<&A::im0> a0) {}
 }
+
+namespace test7 {
+  template<typename T>
+  struct meta {
+    static const unsigned value = sizeof(T);
+  };
+
+  template<unsigned> struct int_c { 
+    typedef float type;
+  };
+
+  template<typename T>
+  struct X {
+    template<typename U>
+    X(U*, typename int_c<(meta<T>::value + meta<U>::value)>::type *) { }
+  };
+
+  // CHECK: define void @_ZN5test71XIiEC1IdEEPT_PNS_5int_cIXplL_ZNS_4metaIiE5valueEEsrNS6_IS3_EE5valueEE4typeE
+  template X<int>::X(double*, float*);
+}