forked from OSchip/llvm-project
[Clang] Fix assert in Sema::LookupTemplateName so that it does not attempt an unconditional cast to TagType
In Sema::LookupTemplateName(...) seeks to assert that the ObjectType is complete or being defined. If the type is incomplete it will attempt to unconditionally cast it to a TagType and not all incomplete types are a TagType. For example the type could be void or it could be an IncompleteArray. This change adds an additional check to confirm it is a TagType before attempting to check if it is incomplete or being defined Differential Revision: https://reviews.llvm.org/D132712
This commit is contained in:
parent
f9445ae75c
commit
21dfe482e1
clang
|
@ -81,6 +81,9 @@ Bug Fixes
|
|||
- Fix a crash when generating code coverage information for an
|
||||
``if consteval`` statement. This fixes
|
||||
`Issue 57377 <https://github.com/llvm/llvm-project/issues/57377>`_.
|
||||
- Fix assert that triggers a crash during template name lookup when a type was
|
||||
incomplete but was not also a TagType. This fixes
|
||||
`Issue 57387 <https://github.com/llvm/llvm-project/issues/57387>`_.
|
||||
|
||||
|
||||
Improvements to Clang's diagnostics
|
||||
|
|
|
@ -399,6 +399,7 @@ bool Sema::LookupTemplateName(LookupResult &Found,
|
|||
LookupCtx = computeDeclContext(ObjectType);
|
||||
IsDependent = !LookupCtx && ObjectType->isDependentType();
|
||||
assert((IsDependent || !ObjectType->isIncompleteType() ||
|
||||
!ObjectType->getAs<TagType>() ||
|
||||
ObjectType->castAs<TagType>()->isBeingDefined()) &&
|
||||
"Caller should have completed object type");
|
||||
|
||||
|
|
|
@ -228,3 +228,19 @@ namespace pr16676 {
|
|||
.i; // expected-error {{member reference type 'S *' is a pointer; did you mean to use '->'}}
|
||||
}
|
||||
}
|
||||
|
||||
namespace LookupTemplateNameAssert {
|
||||
void f() {}
|
||||
|
||||
typedef int at[];
|
||||
const at& f2(){}
|
||||
|
||||
void g() {
|
||||
f().junk<int>(); // expected-error {{member reference base type 'void' is not a structure or union}}
|
||||
// expected-error@-1 {{expected '(' for function-style cast or type construction}}
|
||||
// expected-error@-2 {{expected expression}}
|
||||
f2().junk<int>(); // expected-error {{member reference base type 'const at' (aka 'const int[]') is not a structure or union}}
|
||||
// expected-error@-1 {{expected '(' for function-style cast or type construction}}
|
||||
// expected-error@-2 {{expected expression}}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue