[clang] [clang] Handle consteval constructors with default initialization. (PR #144970)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 19 19:25:31 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Eli Friedman (efriedma-quic)
<details>
<summary>Changes</summary>
This is a simple extension of 443377a9d1a8d4a69a317a1a892184c59dd0aec6 to also handle the implicit expressions created by default initialization. This usually doesn't matter, but it's relevant if the constructor stores "this" as a member.
Fixes #<!-- -->135281 .
---
Full diff: https://github.com/llvm/llvm-project/pull/144970.diff
2 Files Affected:
- (modified) clang/lib/Sema/SemaDecl.cpp (+6)
- (modified) clang/test/SemaCXX/cxx2b-consteval-propagate.cpp (+18)
``````````diff
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index bbd63372c168b..e10dc65897b8a 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -14423,6 +14423,9 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl) {
Var->getType().getAddressSpace() == LangAS::hlsl_input)
return;
+ if (getLangOpts().CPlusPlus)
+ ActOnCXXEnterDeclInitializer(nullptr, Var);
+
// C++03 [dcl.init]p9:
// If no initializer is specified for an object, and the
// object is of (possibly cv-qualified) non-POD class type (or
@@ -14458,6 +14461,9 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl) {
}
CheckCompleteVariableDeclaration(Var);
+
+ if (getLangOpts().CPlusPlus)
+ ActOnCXXExitDeclInitializer(nullptr, Var);
}
}
diff --git a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
index dd5063cb29c5b..aa5d79af589ca 100644
--- a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
+++ b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
@@ -576,3 +576,21 @@ int f() {
//expected-note at -2 {{read of non-const variable 'a' is not allowed in a constant expression}}
}
}
+
+#if __cplusplus >= 202302L
+namespace GH135281 {
+ struct B {
+ const void* p;
+ consteval B() : p{this} {}
+ };
+ B b;
+ B b2{};
+ B &&b3{};
+ void f() {
+ static B b4;
+ B b5; // expected-error {{call to consteval function 'GH135281::B::B' is not a constant expression}} \
+ // expected-note {{pointer to temporary is not a constant expression}} \
+ // expected-note {{temporary created here}}
+ }
+}
+#endif
``````````
</details>
https://github.com/llvm/llvm-project/pull/144970
More information about the cfe-commits
mailing list