https://github.com/cor3ntin created https://github.com/llvm/llvm-project/pull/66021:
Per CWG2760, default members initializers should be consider part the body of constructors, which mean they are evaluated in an immediate escalating context. However, this does not apply to static members. This patch produces some extraneous diagnostics, unfortunately we do not have a good way to report an error back to the initializer and this is a pre existing issue Fixes #65985 >From 26a7ef187905eb1b30623833ccfed5f43ab9bfec Mon Sep 17 00:00:00 2001 From: Corentin Jabot <corentinja...@gmail.com> Date: Mon, 11 Sep 2023 23:40:38 +0200 Subject: [PATCH] [Clang] Static member initializers are not immediate escalating context. Per CWG2760, default members initializers should be consider part the body of consstructors, which mean they are evaluated in an immediate escalating context. However, this does not apply to static members. This patch produces some extraneous diagnostics, unfortunately we do not have a good way to report an error back to the initializer and this is a preexisting issue Fixes #65985 --- clang/docs/ReleaseNotes.rst | 4 ++++ clang/lib/Parse/ParseDeclCXX.cpp | 12 ++++++++-- .../SemaCXX/cxx2b-consteval-propagate.cpp | 23 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index d3757c833ef83a2..8bc66ee44e3d289 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -161,6 +161,10 @@ Bug Fixes to C++ Support requires-expression. This fixes: (`#64138 <https://github.com/llvm/llvm-project/issues/64138>_`). +- Fix a crash when calling a non-constant immediate function + in the initializer of a static data member. + (`#65985 <https://github.com/llvm/llvm-project/issues/65985>_`). + Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ - Fixed an import failure of recursive friend class template. diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index 42f268b0911b783..c2a2a561a3f0700 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -3229,13 +3229,21 @@ ExprResult Parser::ParseCXXMemberInitializer(Decl *D, bool IsFunction, assert(Tok.isOneOf(tok::equal, tok::l_brace) && "Data member initializer not starting with '=' or '{'"); + bool IsFieldInitialization = isa_and_present<FieldDecl>(D); + EnterExpressionEvaluationContext Context( Actions, - isa_and_present<FieldDecl>(D) + IsFieldInitialization ? Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed : Sema::ExpressionEvaluationContext::PotentiallyEvaluated, D); - Actions.ExprEvalContexts.back().InImmediateEscalatingFunctionContext = true; + + // CWG2760 + // Default member initializers used to initialize a base or member subobject + // [...] are considered to be part of the function body + Actions.ExprEvalContexts.back().InImmediateEscalatingFunctionContext = + IsFieldInitialization; + if (TryConsumeToken(tok::equal, EqualLoc)) { if (Tok.is(tok::kw_delete)) { // In principle, an initializer of '= delete p;' is legal, but it will diff --git a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp index c5eb7f139327505..f967ce6554d777c 100644 --- a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp +++ b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp @@ -330,3 +330,26 @@ struct S { S s(0); // expected-note {{in the default initializer of 'j'}} } + +namespace GH65985 { + +int consteval operator""_foo(unsigned long long V) { + return 0; +} +int consteval operator""_bar(unsigned long long V); // expected-note 3{{here}} + +struct C { + static const int a = 1_foo; + static constexpr int b = 1_foo; + static const int c = 1_bar; // expected-error {{call to consteval function 'GH65985::operator""_bar' is not a constant expression}} \ + // expected-note {{undefined function 'operator""_bar' cannot be used in a constant expression}} \ + // expected-error {{in-class initializer for static data member is not a constant expression}} + + // FIXME: remove duplicate diagnostics + static constexpr int d = 1_bar; // expected-error {{call to consteval function 'GH65985::operator""_bar' is not a constant expression}} \ + // expected-note {{undefined function 'operator""_bar' cannot be used in a constant expression}} \ + // expected-error {{constexpr variable 'd' must be initialized by a constant expression}} \ + // expected-note {{undefined function 'operator""_bar' cannot be used in a constant expression}} +}; + +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits