]> granicus.if.org Git - clang/commitdiff
Fix mangling substitutions for address-space-qualified class
authorDouglas Gregor <dgregor@apple.com>
Sat, 3 Dec 2011 18:24:43 +0000 (18:24 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sat, 3 Dec 2011 18:24:43 +0000 (18:24 +0000)
types. Patch from Dmitri Rubinstein!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145776 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ItaniumMangle.cpp
test/CodeGenCXX/mangle-address-space.cpp

index b2e1d20ca0122c0f52647485e26413b9a3a28e3b..1e71a627ce93e7b479c10cabf19bb4a601f6ad6a 100644 (file)
@@ -2984,8 +2984,15 @@ bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) {
   return mangleSubstitution(reinterpret_cast<uintptr_t>(ND));
 }
 
+/// \brief Determine whether the given type has any qualifiers that are
+/// relevant for substitutions.
+static bool hasMangledSubstitutionQualifiers(QualType T) {
+  Qualifiers Qs = T.getQualifiers();
+  return Qs.getCVRQualifiers() || Qs.hasAddressSpace();
+}
+
 bool CXXNameMangler::mangleSubstitution(QualType T) {
-  if (!T.getCVRQualifiers()) {
+  if (!hasMangledSubstitutionQualifiers(T)) {
     if (const RecordType *RT = T->getAs<RecordType>())
       return mangleSubstitution(RT->getDecl());
   }
@@ -3171,7 +3178,7 @@ bool CXXNameMangler::mangleStandardSubstitution(const NamedDecl *ND) {
 }
 
 void CXXNameMangler::addSubstitution(QualType T) {
-  if (!T.getCVRQualifiers()) {
+  if (!hasMangledSubstitutionQualifiers(T)) {
     if (const RecordType *RT = T->getAs<RecordType>()) {
       addSubstitution(RT->getDecl());
       return;
index fbbcbfa35b58f9d00e1138c70bd8abbb4e359354..ff23c206911cf48070d9e52712e4a349fd921289 100644 (file)
@@ -4,3 +4,9 @@
 void f0(char *p) { }
 // CHECK: define void @_Z2f0PU3AS1c
 void f0(char __attribute__((address_space(1))) *p) { }
+
+struct OpaqueType;
+typedef OpaqueType __attribute__((address_space(100))) * OpaqueTypePtr;
+
+// CHECK: define void @_Z2f0PU5AS10010OpaqueType
+void f0(OpaqueTypePtr) { }