[MS ABI] Treat ConstantArrayType like IncompleteArrayType in args
authorDavid Majnemer <david.majnemer@gmail.com>
Thu, 23 Apr 2015 05:21:20 +0000 (05:21 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Thu, 23 Apr 2015 05:21:20 +0000 (05:21 +0000)
Type backreferences for arguments use the DecayedType's original type.
Because of this, arguments with the same canonical type with the same
mangling would not backreference each other if one was a
ConstantArrayType while the other was an IncompleteArrayType.  Solve
this by canonicalizing the ConstantArrayType to a suitable
IncompleteArrayType.

This fixes PR23325.

llvm-svn: 235572

clang/lib/AST/MicrosoftMangle.cpp
clang/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp

index 3689102..6c95342 100644 (file)
@@ -1377,17 +1377,27 @@ void MicrosoftCXXNameMangler::mangleArgumentType(QualType T,
   // e.g.
   // void (*x)(void) will not form a backreference with void x(void)
   void *TypePtr;
-  if (const DecayedType *DT = T->getAs<DecayedType>()) {
-    TypePtr = DT->getOriginalType().getCanonicalType().getAsOpaquePtr();
+  if (const auto *DT = T->getAs<DecayedType>()) {
+    QualType OriginalType = DT->getOriginalType();
+    // Decayed ConstantArrayType should be treated identically to decayed
+    // IncompleteArrayType.
+    if (const auto *CAT =
+            getASTContext().getAsConstantArrayType(OriginalType))
+      OriginalType = getASTContext().getIncompleteArrayType(
+          CAT->getElementType(), CAT->getSizeModifier(),
+          CAT->getIndexTypeCVRQualifiers());
+
+    TypePtr = OriginalType.getCanonicalType().getAsOpaquePtr();
     // If the original parameter was textually written as an array,
     // instead treat the decayed parameter like it's const.
     //
     // e.g.
     // int [] -> int * const
-    if (DT->getOriginalType()->isArrayType())
+    if (OriginalType->isArrayType())
       T = T.withConst();
-  } else
+  } else {
     TypePtr = T.getCanonicalType().getAsOpaquePtr();
+  }
 
   ArgBackRefMap::iterator Found = TypeBackReferences.find(TypePtr);
 
index fae2e1a..41aa89b 100644 (file)
@@ -258,3 +258,8 @@ void mangle_yes_backref3(ptr_to_fun_type *const, void (**const)(void)) {}
 void mangle_yes_backref4(int *const __restrict, int *const __restrict) {}
 // CHECK: "\01?mangle_yes_backref4@@YAXQIAH0@Z"
 // X64:   "\01?mangle_yes_backref4@@YAXQEIAH0@Z"
+
+struct S {};
+void pr23325(const S[1], const S[]) {}
+// CHECK: "\01?pr23325@@YAXQBUS@@0@Z"
+// X64:   "\01?pr23325@@YAXQEBUS@@0@Z"