diff options
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 15 | ||||
-rw-r--r-- | clang/test/CodeGenObjCXX/subst-sel.mm | 4 | ||||
-rw-r--r-- | clang/test/CodeGenOpenCL/opencl_types.cl | 3 |
3 files changed, 21 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; diff --git a/clang/test/CodeGenObjCXX/subst-sel.mm b/clang/test/CodeGenObjCXX/subst-sel.mm new file mode 100644 index 00000000000..f4a2b840fe7 --- /dev/null +++ b/clang/test/CodeGenObjCXX/subst-sel.mm @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s + +// CHECK: @_Z4bad1P8NSObjectP13objc_selectorP11objc_objectS4_ +void bad1(struct NSObject *, SEL, id, id) {} diff --git a/clang/test/CodeGenOpenCL/opencl_types.cl b/clang/test/CodeGenOpenCL/opencl_types.cl index ed2bf6dd114..4ef94e660e8 100644 --- a/clang/test/CodeGenOpenCL/opencl_types.cl +++ b/clang/test/CodeGenOpenCL/opencl_types.cl @@ -35,3 +35,6 @@ kernel void foo(image1d_t img) { fnc4smp(glb_smp); // CHECK: call void @fnc4smp(i32 } + +void __attribute__((overloadable)) bad1(image1d_t *b, image2d_t *c, image2d_t *d) {} +// CHECK-LABEL: @_Z4bad1P11ocl_image1dP11ocl_image2dS2_ |