diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-11-28 22:22:46 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-11-28 22:22:46 +0000 |
commit | eea02eefe75fdcef77ef033b4a536e790588b883 (patch) | |
tree | d8fffc64d6323bfaa908f644bc42023bfa75076d /clang/lib/AST/ItaniumMangle.cpp | |
parent | 9a9da99673dbaf14d9c7f1762455cfb3afa2881b (diff) | |
download | bcm5719-llvm-eea02eefe75fdcef77ef033b4a536e790588b883.tar.gz bcm5719-llvm-eea02eefe75fdcef77ef033b4a536e790588b883.zip |
AST: Consider pseudo-struct builtin types as substitutable
We didn't consider types like ObjCSel as a substitution candidate.
This fixes PR21688.
llvm-svn: 222941
Diffstat (limited to 'clang/lib/AST/ItaniumMangle.cpp')
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 9e9c1718d16..31250aaa20f 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -1840,6 +1840,19 @@ void CXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) { Context.mangleObjCMethodName(MD, Out); } +static bool isTypeSubstitutable(Qualifiers Quals, const Type *Ty) { + if (Quals) + return true; + if (Ty->isSpecificBuiltinType(BuiltinType::ObjCSel)) + return true; + if (Ty->isOpenCLSpecificType()) + return true; + if (Ty->isBuiltinType()) + return false; + + return true; +} + void CXXNameMangler::mangleType(QualType T) { // If our type is instantiation-dependent but not dependent, we mangle // it as it was written in the source, removing any top-level sugar. @@ -1881,7 +1894,7 @@ void CXXNameMangler::mangleType(QualType T) { Qualifiers quals = split.Quals; const Type *ty = split.Ty; - bool isSubstitutable = quals || !isa<BuiltinType>(T); + bool isSubstitutable = isTypeSubstitutable(quals, ty); if (isSubstitutable && mangleSubstitution(T)) return; |