Skip to content

Commit

Permalink
[Clang] prevent recovery call expression from proceeding with explici…
Browse files Browse the repository at this point in the history
…t attributes and undeclared templates (#107786)

Fixes #107047
Fixes #49093
  • Loading branch information
a-tarasyuk authored Oct 10, 2024
1 parent 741ad3a commit 1fa3c85
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 1 deletion.
2 changes: 2 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,8 @@ Bug Fixes to C++ Support
- Clang now instantiates the correct lambda call operator when a lambda's class type is
merged across modules. (#GH110401)
- Fix a crash when parsing a pseudo destructor involving an invalid type. (#GH111460)
- Fixed an assertion failure when invoking recovery call expressions with explicit attributes
and undeclared templates. (#GH107047, #GH49093)

Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down
10 changes: 9 additions & 1 deletion clang/lib/Sema/SemaExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2470,7 +2470,15 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
LookupCtx ? LookupCtx : (SS.isEmpty() ? CurContext : nullptr);
while (DC) {
if (isa<CXXRecordDecl>(DC)) {
LookupQualifiedName(R, DC);
if (ExplicitTemplateArgs) {
if (LookupTemplateName(
R, S, SS, Context.getRecordType(cast<CXXRecordDecl>(DC)),
/*EnteringContext*/ false, TemplateNameIsRequired,
/*RequiredTemplateKind*/ nullptr, /*AllowTypoCorrection*/ true))
return true;
} else {
LookupQualifiedName(R, DC);
}

if (!R.empty()) {
// Don't give errors about ambiguities in this lookup.
Expand Down
32 changes: 32 additions & 0 deletions clang/test/SemaTemplate/recovery-crash-cxx20.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s

namespace GH49093 {
class B {
public:
static int a() { return 0; } // expected-note {{declared as a non-template here}}
decltype(a< 0 >(0)) test; // expected-error {{'a' does not refer to a template}}
};

struct C {
static int a() { return 0; } // expected-note {{declared as a non-template here}}
decltype(a < 0 > (0)) test; // expected-error {{'a' does not refer to a template}}
};

void test_is_bool(bool t) {}
void test_is_bool(int t) {}

int main() {
B b;
test_is_bool(b.test);

C c;
test_is_bool(c.test);
}
}

namespace GH107047 {
struct A {
static constexpr auto test() { return 1; } // expected-note {{declared as a non-template here}}
static constexpr int s = test< 1 >(); // expected-error {{'test' does not refer to a template}}
};
}

0 comments on commit 1fa3c85

Please sign in to comment.