diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 1d74c492845a6..09302040a3510 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -266,6 +266,9 @@ Bug Fixes in This Version (`#64836 `_) - Clang now allows an ``_Atomic`` qualified integer in a switch statement. Fixes (`#65557 `_) +- Fixes crash when trying to obtain the common sugared type of + `decltype(instantiation-dependent-expr)`. + Fixes (`#67603 `_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 57aaa05b1d81d..5ce0b54166e02 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -12705,7 +12705,6 @@ static QualType getCommonNonSugarTypeNode(ASTContext &Ctx, const Type *X, #define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free") SUGAR_FREE_TYPE(Builtin) - SUGAR_FREE_TYPE(Decltype) SUGAR_FREE_TYPE(DeducedTemplateSpecialization) SUGAR_FREE_TYPE(DependentBitInt) SUGAR_FREE_TYPE(Enum) @@ -12935,6 +12934,14 @@ static QualType getCommonNonSugarTypeNode(ASTContext &Ctx, const Type *X, TY->getTemplateName()), As, X->getCanonicalTypeInternal()); } + case Type::Decltype: { + const auto *DX = cast(X), *DY = cast(Y); + assert(DX->isDependentType()); + assert(DY->isDependentType()); + assert(Ctx.hasSameExpr(DX->getUnderlyingExpr(), DY->getUnderlyingExpr())); + // As Decltype is not uniqued, building a common type would be wasteful. + return QualType(DX, 0); + } case Type::DependentName: { const auto *NX = cast(X), *NY = cast(Y); diff --git a/clang/test/SemaCXX/sugar-common-types.cpp b/clang/test/SemaCXX/sugar-common-types.cpp index 4a8ff2addb663..e1c7578a66b9c 100644 --- a/clang/test/SemaCXX/sugar-common-types.cpp +++ b/clang/test/SemaCXX/sugar-common-types.cpp @@ -142,3 +142,14 @@ namespace PR61419 { extern const pair p; id t = false ? p.first : p.second; } // namespace PR61419 + +namespace GH67603 { + template using A = long; + template void h() { + using C = B; + using D = B; + N t = 0 ? A() : A(); + // expected-error@-1 {{rvalue of type 'A' (aka 'long')}} + } + template void h(); +} // namespace GH67603