Mangle dependent name expressions. Fixes PR5063.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82915 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2009-09-27 20:11:34 +00:00
Родитель e45117b945
Коммит 50755b0dcc
2 изменённых файлов: 38 добавлений и 0 удалений

Просмотреть файл

@ -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;
}
}
}

Просмотреть файл

@ -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*>();