[clang] Fix a bug with qualified name lookup into current instantiation (#73018)
Due to d0d2ee0e4b clang doesn't perform
qualified name lookup into the current instantiation when it has
dependent bases, because of that `getTypeName` call always returns null
for unknown specialization case. When there is a `typename` keyword,
`DependentNameType` is constructed instead of simply returning null.
This change attempts to do the same in case of `typename` absence.
Fixes https://github.com/llvm/llvm-project/issues/13826
This commit is contained in:
committed by
GitHub
parent
e9869b5770
commit
14ca8d44d0
@@ -645,6 +645,9 @@ Bug Fixes in This Version
|
||||
- Fix crash when the object used as a ``static_assert`` message has ``size`` or ``data`` members
|
||||
which are not member functions.
|
||||
- Support UDLs in ``static_assert`` message.
|
||||
- Fixed false positive error emitted by clang when performing qualified name
|
||||
lookup and the current class instantiation has dependent bases.
|
||||
Fixes (`#13826 <https://github.com/llvm/llvm-project/issues/13826>`_)
|
||||
|
||||
Bug Fixes to Compiler Builtins
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
@@ -442,7 +442,6 @@ ParsedType Sema::getTypeName(const IdentifierInfo &II, SourceLocation NameLoc,
|
||||
UsingShadowDecl *FoundUsingShadow = nullptr;
|
||||
switch (Result.getResultKind()) {
|
||||
case LookupResult::NotFound:
|
||||
case LookupResult::NotFoundInCurrentInstantiation:
|
||||
if (CorrectedII) {
|
||||
TypeNameValidatorCCC CCC(/*AllowInvalid=*/true, isClassName,
|
||||
AllowDeducedTemplate);
|
||||
@@ -482,7 +481,18 @@ ParsedType Sema::getTypeName(const IdentifierInfo &II, SourceLocation NameLoc,
|
||||
}
|
||||
}
|
||||
}
|
||||
// If typo correction failed or was not performed, fall through
|
||||
Result.suppressDiagnostics();
|
||||
return nullptr;
|
||||
case LookupResult::NotFoundInCurrentInstantiation:
|
||||
if (AllowImplicitTypename == ImplicitTypenameContext::Yes) {
|
||||
QualType T = Context.getDependentNameType(ElaboratedTypeKeyword::None,
|
||||
SS->getScopeRep(), &II);
|
||||
TypeLocBuilder TLB;
|
||||
DependentNameTypeLoc TL = TLB.push<DependentNameTypeLoc>(T);
|
||||
TL.setQualifierLoc(SS->getWithLocInContext(Context));
|
||||
TL.setNameLoc(NameLoc);
|
||||
return CreateParsedType(T, TLB.getTypeSourceInfo(Context, T));
|
||||
}
|
||||
[[fallthrough]];
|
||||
case LookupResult::FoundOverloaded:
|
||||
case LookupResult::FoundUnresolvedValue:
|
||||
|
||||
@@ -130,3 +130,17 @@ namespace PR5812 {
|
||||
|
||||
Derived<int> di;
|
||||
}
|
||||
|
||||
namespace GH13826 {
|
||||
template <typename T> struct A {
|
||||
typedef int type;
|
||||
struct B;
|
||||
};
|
||||
|
||||
template <typename T> struct A<T>::B : A<T> {
|
||||
B::type t;
|
||||
};
|
||||
|
||||
A<int> a;
|
||||
A<int>::B b;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user