зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
e45117b945
Коммит
50755b0dcc
|
@ -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*>();
|
||||
|
|
Загрузка…
Ссылка в новой задаче