[clang] [clang] Fix array types comparison in getCommonSugaredType (PR #131649)

Matheus Izvekov via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 19 10:12:11 PDT 2025


================
@@ -14171,6 +14171,15 @@ static QualType getCommonSugarTypeNode(ASTContext &Ctx, const Type *X,
 static auto unwrapSugar(SplitQualType &T, Qualifiers &QTotal) {
   SmallVector<SplitQualType, 8> R;
   while (true) {
+    if (const auto *ATy = dyn_cast<ArrayType>(T.Ty)) {
+      // C++ 9.3.3.4p3: Any type of the form "cv-qualifier-seq array of N U" is
+      // adjusted to "array of N cv-qualifier-seq U".
+      // C23 6.7.3p10: If the specification of an array type includes any type
+      // qualifiers, both the array and the element type are so-qualified.
+      //
+      // To simplify comparison remove the redundant qualifiers from the array.
+      T.Quals.removeCVRQualifiers(Qualifiers::Const | Qualifiers::Volatile);
----------------
mizvekov wrote:

Alright, this needs more thought, but regardless, getCommonArrayElementType is the correct place to fix the problem.

We don't want to add special cases for ArrayTypes in unwrapSugar, because it's in the fast path, and most type nodes are not ArrayTypes, and most types don't even have ArrayTypes in them.

So this is why things are layered this way.

https://github.com/llvm/llvm-project/pull/131649


More information about the cfe-commits mailing list