diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -81,6 +81,9 @@ - Fix a crash when generating code coverage information for an ``if consteval`` statement. This fixes `Issue 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 `_. Improvements to Clang's diagnostics diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -399,6 +399,7 @@ LookupCtx = computeDeclContext(ObjectType); IsDependent = !LookupCtx && ObjectType->isDependentType(); assert((IsDependent || !ObjectType->isIncompleteType() || + !ObjectType->getAs() || ObjectType->castAs()->isBeingDefined()) && "Caller should have completed object type"); diff --git a/clang/test/SemaCXX/member-expr.cpp b/clang/test/SemaCXX/member-expr.cpp --- a/clang/test/SemaCXX/member-expr.cpp +++ b/clang/test/SemaCXX/member-expr.cpp @@ -228,3 +228,19 @@ .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(); // 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(); // 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}} +} +}