Add name mangling for DeclRefExprs that refer to external names
llvm-svn: 97418
This commit is contained in:
parent
af197502d6
commit
5610db6923
|
@ -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());
|
||||
|
|
|
@ -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*);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue