https://github.com/mizvekov created https://github.com/llvm/llvm-project/pull/67739
While a DecltypeType node itself is not uniqued, an instantiation dependent DecltypeType will have a DependentDecltypeType as an underlying type, which is uniqued. In that case, there can be non-identical non-sugar DecltypeTypes nodes which nonetheless represent the same type. Fixes https://github.com/llvm/llvm-project/issues/67603 >From e6c6a3868ac45f09ec3ddaa888b35ed759c28f33 Mon Sep 17 00:00:00 2001 From: Matheus Izvekov <mizve...@gmail.com> Date: Thu, 28 Sep 2023 22:38:59 +0200 Subject: [PATCH] [clang] implement common sugared type of inst-dependent DecltypeType While a DecltypeType node itself is not uniqued, an instantiation dependent DecltypeType will have a DependentDecltypeType as an underlying type, which is uniqued. In that case, there can be non-identical non-sugar DecltypeTypes nodes which nonetheless represent the same type. Fixes https://github.com/llvm/llvm-project/issues/67603 --- clang/lib/AST/ASTContext.cpp | 9 ++++++++- clang/test/SemaCXX/sugar-common-types.cpp | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 57aaa05b1d81ddb..5ce0b54166e0255 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<DecltypeType>(X), *DY = cast<DecltypeType>(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<DependentNameType>(X), *NY = cast<DependentNameType>(Y); diff --git a/clang/test/SemaCXX/sugar-common-types.cpp b/clang/test/SemaCXX/sugar-common-types.cpp index 4a8ff2addb66359..e1c7578a66b9cad 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<id, id> p; id t = false ? p.first : p.second; } // namespace PR61419 + +namespace GH67603 { + template <class> using A = long; + template <class B> void h() { + using C = B; + using D = B; + N t = 0 ? A<decltype(C())>() : A<decltype(D())>(); + // expected-error@-1 {{rvalue of type 'A<decltype(C())>' (aka 'long')}} + } + template void h<int>(); +} // namespace GH67603 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits