mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 15:41:46 +00:00
[clang] implement common sugared type of inst-dependent DecltypeType (#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
This commit is contained in:
parent
3686a0b611
commit
06721bb8b4
@ -266,6 +266,9 @@ Bug Fixes in This Version
|
||||
(`#64836 <https://github.com/llvm/llvm-project/issues/64836>`_)
|
||||
- Clang now allows an ``_Atomic`` qualified integer in a switch statement. Fixes
|
||||
(`#65557 <https://github.com/llvm/llvm-project/issues/65557>`_)
|
||||
- Fixes crash when trying to obtain the common sugared type of
|
||||
`decltype(instantiation-dependent-expr)`.
|
||||
Fixes (`#67603 <https://github.com/llvm/llvm-project/issues/67603>`_)
|
||||
|
||||
Bug Fixes to Compiler Builtins
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user