[clang] [clang] implement common sugared type of inst-dependent DecltypeType (PR #67739)
Matheus Izvekov via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 28 14:18:35 PDT 2023
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 <mizvekov at 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 at -1 {{rvalue of type 'A<decltype(C())>' (aka 'long')}}
+ }
+ template void h<int>();
+} // namespace GH67603
More information about the cfe-commits
mailing list