diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-27 20:11:34 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-27 20:11:34 +0000 |
commit | 02bca738b4876f4c3f437c9285bd8a50bb2631a0 (patch) | |
tree | 3ee8091cefdbd364d9da3af74539e709cc2d97ec | |
parent | facb867af3530bf817d4bbe5e23744612a25cb19 (diff) | |
download | bcm5719-llvm-02bca738b4876f4c3f437c9285bd8a50bb2631a0.tar.gz bcm5719-llvm-02bca738b4876f4c3f437c9285bd8a50bb2631a0.zip |
Mangle dependent name expressions. Fixes PR5063.
llvm-svn: 82915
-rw-r--r-- | clang/lib/CodeGen/Mangle.cpp | 20 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle.cpp | 18 |
2 files changed, 38 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index ab157e56bfb..61555ad19db 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/lib/CodeGen/Mangle.cpp @@ -20,6 +20,7 @@ #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclObjC.h" #include "clang/AST/DeclTemplate.h" +#include "clang/AST/ExprCXX.h" #include "clang/Basic/SourceManager.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/raw_ostream.h" @@ -971,7 +972,26 @@ void CXXNameMangler::mangleExpression(const Expr *E) { } } + + break; + } + + case Expr::UnresolvedDeclRefExprClass: { + const UnresolvedDeclRefExpr *DRE = cast<UnresolvedDeclRefExpr>(E); + const Type *QTy = DRE->getQualifier()->getAsType(); + assert(QTy && "Qualifier was not type!"); + + // ::= sr <type> <unqualified-name> # dependent name + Out << "sr"; + mangleType(QualType(QTy, 0)); + + assert(DRE->getDeclName().getNameKind() == DeclarationName::Identifier && + "Unhandled decl name kind!"); + mangleSourceName(DRE->getDeclName().getAsIdentifierInfo()); + + break; } + } } diff --git a/clang/test/CodeGenCXX/mangle.cpp b/clang/test/CodeGenCXX/mangle.cpp index a55f5b97fee..86f5fb0d5bb 100644 --- a/clang/test/CodeGenCXX/mangle.cpp +++ b/clang/test/CodeGenCXX/mangle.cpp @@ -180,3 +180,21 @@ template <typename T> typename T::U ft6(const T&) { return 0; } // CHECK: @_Z3ft6I1SENT_1UERKS1_ template int ft6<S>(const S&); + +template<typename> struct __is_scalar { + enum { __value = 1 }; +}; + +template<bool, typename> struct __enable_if { }; + +template<typename T> struct __enable_if<true, T> { + typedef T __type; +}; + +// PR5063 +template<typename T> typename __enable_if<__is_scalar<T>::__value, void>::__type ft7() { } + +// CHECK: @_Z3ft7IiEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv +template void ft7<int>(); +// CHECK: @_Z3ft7IPvEN11__enable_ifIXsr11__is_scalarIT_E7__valueEvE6__typeEv +template void ft7<void*>(); |