Add name mangling for DeclRefExprs that refer to external names

llvm-svn: 97418
This commit is contained in:
Douglas Gregor 2010-02-28 21:40:32 +00:00
parent af197502d6
commit 5610db6923
2 changed files with 28 additions and 3 deletions

View 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());

View 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*);
}