diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 18 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp | 5 |
2 files changed, 19 insertions, 4 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 36891021142..6c953421dbe 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -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); diff --git a/clang/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp b/clang/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp index fae2e1ab2df..41aa89b61aa 100644 --- a/clang/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp +++ b/clang/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp @@ -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" |