llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: ahmed mohamed kamel (AhmedKamel10)

<details>
<summary>Changes</summary>

This patch diagnoses undefined behavior during constant evaluation when a 
member function is called for an object under construction before all 
base classes have been initialized. 
Fixes #<!-- -->211286

---
Full diff: https://github.com/llvm/llvm-project/pull/219358.diff


2 Files Affected:

- (modified) clang/lib/AST/ExprConstant.cpp (+6) 
- (modified) clang/test/SemaCXX/constant-expression-cxx2a.cpp (+19) 


``````````diff
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 9702105951b7b..34c1cb39dd8b1 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -6625,6 +6625,12 @@ static bool
 checkNonVirtualMemberCallThisPointer(EvalInfo &Info, const Expr *E,
                                      const LValue &This,
                                      const CXXMethodDecl *NamedMember) {
+  ConstructionPhase Phase =
+      Info.isEvaluatingCtorDtor(This.getLValueBase(), This.Designator.Entries);
+  if (Phase == ConstructionPhase::Bases) {
+    Info.FFDiag(E);
+    return false;
+  }                                                       
   return checkDynamicType(
       Info, E, This,
       isa<CXXDestructorDecl>(NamedMember) ? AK_Destroy : AK_MemberCall, false);
diff --git a/clang/test/SemaCXX/constant-expression-cxx2a.cpp 
b/clang/test/SemaCXX/constant-expression-cxx2a.cpp
index 870865646a61e..88b4808a4671e 100644
--- a/clang/test/SemaCXX/constant-expression-cxx2a.cpp
+++ b/clang/test/SemaCXX/constant-expression-cxx2a.cpp
@@ -1544,3 +1544,22 @@ namespace GH197403 {
   }
   static_assert(test() == 0);
 }
+
+namespace GH211286 {
+  struct A {
+    constexpr A(int x) : val(x) {}
+    int val;
+  };
+
+  struct B : A {
+    constexpr int f() const { return 42; }
+    constexpr B() : A(f()) {} // expected-note 2{{subexpression not valid in a 
constant expression}}
+  };
+
+  constexpr int foo() {
+    constexpr B b{}; // expected-error {{constexpr variable 'b' must be 
initialized by a constant expression}} expected-note 2{{in call to 'B()'}}
+    return b.val;
+  }
+
+  constexpr auto x = foo(); // expected-error {{constexpr variable 'x' must be 
initialized by a constant expression}} expected-note {{in call to 'foo()'}}
+}
\ No newline at end of file

``````````

</details>


https://github.com/llvm/llvm-project/pull/219358
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to