[clang] [Clang] Ensure ``if consteval`` consititute an immediate function context (PR #91939)

2024-05-13 Thread via cfe-commits

https://github.com/cor3ntin created 
https://github.com/llvm/llvm-project/pull/91939

We did not set the correct evaluation context for the compound statement of an 
``if consteval`` statement
in a templated entity in TreeTransform.

Fixes #91509

>From e84c8c5e0f1bc9e094dfef961763db825234f7aa Mon Sep 17 00:00:00 2001
From: Corentin Jabot 
Date: Mon, 13 May 2024 11:26:40 +0200
Subject: [PATCH] [Clang] Ensure ``if consteval`` consititute an immediate
 function context.

We did not set the correct evaluation context for the compound
statement of an ``if consteval`` statement
in a templated entity in TreeTransform.

Fixes 91509
---
 clang/docs/ReleaseNotes.rst   |  1 +
 clang/lib/Sema/TreeTransform.h| 18 +
 .../SemaCXX/cxx2b-consteval-propagate.cpp | 26 +++
 3 files changed, 45 insertions(+)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7c5dcc59c7016..4702b8c10cdbb 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -707,6 +707,7 @@ Bug Fixes to C++ Support
   initialized, rather than evaluating them as a part of the larger manifestly 
constant evaluated
   expression.
 - Fix a bug in access control checking due to dealyed checking of friend 
declaration. Fixes (#GH12361).
+- Correctly treat the compound statement of an ``if consteval`` as an 
immediate context. Fixes (#GH91509).
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 0b3cf566e3a7b..391cfb0fa4032 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -7964,6 +7964,15 @@ TreeTransform::TransformIfStmt(IfStmt *S) {
   // Transform the "then" branch.
   StmtResult Then;
   if (!ConstexprConditionValue || *ConstexprConditionValue) {
+Sema::ExpressionEvaluationContext Context =
+S->isNonNegatedConsteval()
+? Sema::ExpressionEvaluationContext::ImmediateFunctionContext
+: Sema::ExpressionEvaluationContext::PotentiallyEvaluated;
+
+EnterExpressionEvaluationContext Ctx(
+getSema(), Context, nullptr,
+Sema::ExpressionEvaluationContextRecord::EK_Other);
+
 Then = getDerived().TransformStmt(S->getThen());
 if (Then.isInvalid())
   return StmtError();
@@ -7978,6 +7987,15 @@ TreeTransform::TransformIfStmt(IfStmt *S) {
   // Transform the "else" branch.
   StmtResult Else;
   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
+Sema::ExpressionEvaluationContext Context =
+S->isNegatedConsteval()
+? Sema::ExpressionEvaluationContext::ImmediateFunctionContext
+: Sema::ExpressionEvaluationContext::PotentiallyEvaluated;
+
+EnterExpressionEvaluationContext Ctx(
+getSema(), Context, nullptr,
+Sema::ExpressionEvaluationContextRecord::EK_Other);
+
 Else = getDerived().TransformStmt(S->getElse());
 if (Else.isInvalid())
   return StmtError();
diff --git a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp 
b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
index 37fa1f1bdf59d..07937deb66738 100644
--- a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
+++ b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
@@ -420,3 +420,29 @@ int f = *fn().value + fn2();  // expected-error {{call to 
consteval function 'lv
   // expected-note {{pointer to heap-allocated 
object}}
 }
 #endif
+
+
+#if __cplusplus >= 202302L
+
+namespace GH91509 {
+
+consteval int f(int) { return 0; }
+
+template
+constexpr int g(int x) {
+if consteval {
+return f(x);
+}
+if !consteval {}
+else {
+return f(x);
+}
+return 1;
+}
+
+int h(int x) {
+return g(x);
+}
+}
+
+#endif

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Ensure ``if consteval`` consititute an immediate function context (PR #91939)

2024-05-13 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: cor3ntin (cor3ntin)


Changes

We did not set the correct evaluation context for the compound statement of an 
``if consteval`` statement
in a templated entity in TreeTransform.

Fixes #91509

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


3 Files Affected:

- (modified) clang/docs/ReleaseNotes.rst (+1) 
- (modified) clang/lib/Sema/TreeTransform.h (+18) 
- (modified) clang/test/SemaCXX/cxx2b-consteval-propagate.cpp (+26) 


``diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7c5dcc59c7016..4702b8c10cdbb 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -707,6 +707,7 @@ Bug Fixes to C++ Support
   initialized, rather than evaluating them as a part of the larger manifestly 
constant evaluated
   expression.
 - Fix a bug in access control checking due to dealyed checking of friend 
declaration. Fixes (#GH12361).
+- Correctly treat the compound statement of an ``if consteval`` as an 
immediate context. Fixes (#GH91509).
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 0b3cf566e3a7b..391cfb0fa4032 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -7964,6 +7964,15 @@ TreeTransform::TransformIfStmt(IfStmt *S) {
   // Transform the "then" branch.
   StmtResult Then;
   if (!ConstexprConditionValue || *ConstexprConditionValue) {
+Sema::ExpressionEvaluationContext Context =
+S->isNonNegatedConsteval()
+? Sema::ExpressionEvaluationContext::ImmediateFunctionContext
+: Sema::ExpressionEvaluationContext::PotentiallyEvaluated;
+
+EnterExpressionEvaluationContext Ctx(
+getSema(), Context, nullptr,
+Sema::ExpressionEvaluationContextRecord::EK_Other);
+
 Then = getDerived().TransformStmt(S->getThen());
 if (Then.isInvalid())
   return StmtError();
@@ -7978,6 +7987,15 @@ TreeTransform::TransformIfStmt(IfStmt *S) {
   // Transform the "else" branch.
   StmtResult Else;
   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
+Sema::ExpressionEvaluationContext Context =
+S->isNegatedConsteval()
+? Sema::ExpressionEvaluationContext::ImmediateFunctionContext
+: Sema::ExpressionEvaluationContext::PotentiallyEvaluated;
+
+EnterExpressionEvaluationContext Ctx(
+getSema(), Context, nullptr,
+Sema::ExpressionEvaluationContextRecord::EK_Other);
+
 Else = getDerived().TransformStmt(S->getElse());
 if (Else.isInvalid())
   return StmtError();
diff --git a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp 
b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
index 37fa1f1bdf59d..07937deb66738 100644
--- a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
+++ b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
@@ -420,3 +420,29 @@ int f = *fn().value + fn2();  // expected-error {{call to 
consteval function 'lv
   // expected-note {{pointer to heap-allocated 
object}}
 }
 #endif
+
+
+#if __cplusplus >= 202302L
+
+namespace GH91509 {
+
+consteval int f(int) { return 0; }
+
+template
+constexpr int g(int x) {
+if consteval {
+return f(x);
+}
+if !consteval {}
+else {
+return f(x);
+}
+return 1;
+}
+
+int h(int x) {
+return g(x);
+}
+}
+
+#endif

``




https://github.com/llvm/llvm-project/pull/91939
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Ensure ``if consteval`` consititute an immediate function context (PR #91939)

2024-05-13 Thread Mital Ashok via cfe-commits


@@ -7964,6 +7964,15 @@ TreeTransform::TransformIfStmt(IfStmt *S) {
   // Transform the "then" branch.
   StmtResult Then;
   if (!ConstexprConditionValue || *ConstexprConditionValue) {
+Sema::ExpressionEvaluationContext Context =
+S->isNonNegatedConsteval()
+? Sema::ExpressionEvaluationContext::ImmediateFunctionContext
+: Sema::ExpressionEvaluationContext::PotentiallyEvaluated;
+
+EnterExpressionEvaluationContext Ctx(
+getSema(), Context, nullptr,
+Sema::ExpressionEvaluationContextRecord::EK_Other);

MitalAshok wrote:

```suggestion
EnterExpressionEvaluationContext Ctx(
getSema(), Sema::ExpressionEvaluationContext::ImmediateFunctionContext, 
nullptr,
Sema::ExpressionEvaluationContextRecord::EK_Other,
S->isNonNegatedConsteval());
```

(and ditto for the else branch) to only push a context if needed

https://github.com/llvm/llvm-project/pull/91939
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Ensure ``if consteval`` consititute an immediate function context (PR #91939)

2024-05-13 Thread via cfe-commits

https://github.com/cor3ntin updated 
https://github.com/llvm/llvm-project/pull/91939

>From e84c8c5e0f1bc9e094dfef961763db825234f7aa Mon Sep 17 00:00:00 2001
From: Corentin Jabot 
Date: Mon, 13 May 2024 11:26:40 +0200
Subject: [PATCH 1/2] [Clang] Ensure ``if consteval`` consititute an immediate
 function context.

We did not set the correct evaluation context for the compound
statement of an ``if consteval`` statement
in a templated entity in TreeTransform.

Fixes 91509
---
 clang/docs/ReleaseNotes.rst   |  1 +
 clang/lib/Sema/TreeTransform.h| 18 +
 .../SemaCXX/cxx2b-consteval-propagate.cpp | 26 +++
 3 files changed, 45 insertions(+)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7c5dcc59c7016..4702b8c10cdbb 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -707,6 +707,7 @@ Bug Fixes to C++ Support
   initialized, rather than evaluating them as a part of the larger manifestly 
constant evaluated
   expression.
 - Fix a bug in access control checking due to dealyed checking of friend 
declaration. Fixes (#GH12361).
+- Correctly treat the compound statement of an ``if consteval`` as an 
immediate context. Fixes (#GH91509).
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 0b3cf566e3a7b..391cfb0fa4032 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -7964,6 +7964,15 @@ TreeTransform::TransformIfStmt(IfStmt *S) {
   // Transform the "then" branch.
   StmtResult Then;
   if (!ConstexprConditionValue || *ConstexprConditionValue) {
+Sema::ExpressionEvaluationContext Context =
+S->isNonNegatedConsteval()
+? Sema::ExpressionEvaluationContext::ImmediateFunctionContext
+: Sema::ExpressionEvaluationContext::PotentiallyEvaluated;
+
+EnterExpressionEvaluationContext Ctx(
+getSema(), Context, nullptr,
+Sema::ExpressionEvaluationContextRecord::EK_Other);
+
 Then = getDerived().TransformStmt(S->getThen());
 if (Then.isInvalid())
   return StmtError();
@@ -7978,6 +7987,15 @@ TreeTransform::TransformIfStmt(IfStmt *S) {
   // Transform the "else" branch.
   StmtResult Else;
   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
+Sema::ExpressionEvaluationContext Context =
+S->isNegatedConsteval()
+? Sema::ExpressionEvaluationContext::ImmediateFunctionContext
+: Sema::ExpressionEvaluationContext::PotentiallyEvaluated;
+
+EnterExpressionEvaluationContext Ctx(
+getSema(), Context, nullptr,
+Sema::ExpressionEvaluationContextRecord::EK_Other);
+
 Else = getDerived().TransformStmt(S->getElse());
 if (Else.isInvalid())
   return StmtError();
diff --git a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp 
b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
index 37fa1f1bdf59d..07937deb66738 100644
--- a/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
+++ b/clang/test/SemaCXX/cxx2b-consteval-propagate.cpp
@@ -420,3 +420,29 @@ int f = *fn().value + fn2();  // expected-error {{call to 
consteval function 'lv
   // expected-note {{pointer to heap-allocated 
object}}
 }
 #endif
+
+
+#if __cplusplus >= 202302L
+
+namespace GH91509 {
+
+consteval int f(int) { return 0; }
+
+template
+constexpr int g(int x) {
+if consteval {
+return f(x);
+}
+if !consteval {}
+else {
+return f(x);
+}
+return 1;
+}
+
+int h(int x) {
+return g(x);
+}
+}
+
+#endif

>From 9d7a4c78529310cdcf4e92d85ca4f9c5bb8682e6 Mon Sep 17 00:00:00 2001
From: Corentin Jabot 
Date: Mon, 13 May 2024 12:39:51 +0200
Subject: [PATCH 2/2] address review feedback

---
 clang/lib/Sema/TreeTransform.h | 20 ++--
 1 file changed, 6 insertions(+), 14 deletions(-)

diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 391cfb0fa4032..126965088831d 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -7964,14 +7964,10 @@ TreeTransform::TransformIfStmt(IfStmt *S) {
   // Transform the "then" branch.
   StmtResult Then;
   if (!ConstexprConditionValue || *ConstexprConditionValue) {
-Sema::ExpressionEvaluationContext Context =
-S->isNonNegatedConsteval()
-? Sema::ExpressionEvaluationContext::ImmediateFunctionContext
-: Sema::ExpressionEvaluationContext::PotentiallyEvaluated;
-
 EnterExpressionEvaluationContext Ctx(
-getSema(), Context, nullptr,
-Sema::ExpressionEvaluationContextRecord::EK_Other);
+getSema(), Sema::ExpressionEvaluationContext::ImmediateFunctionContext,
+nullptr, Sema::ExpressionEvaluationContextRecord::EK_Other,
+S->isNonNegatedConsteval());
 
 Then = getDerived().TransformStmt(S->getThen());
 if (Then.isInvalid())
@@ -7987,14 +7983,10 @@ TreeTransform::TransformIf

[clang] [Clang] Ensure ``if consteval`` consititute an immediate function context (PR #91939)

2024-05-13 Thread via cfe-commits


@@ -7964,6 +7964,15 @@ TreeTransform::TransformIfStmt(IfStmt *S) {
   // Transform the "then" branch.
   StmtResult Then;
   if (!ConstexprConditionValue || *ConstexprConditionValue) {
+Sema::ExpressionEvaluationContext Context =
+S->isNonNegatedConsteval()
+? Sema::ExpressionEvaluationContext::ImmediateFunctionContext
+: Sema::ExpressionEvaluationContext::PotentiallyEvaluated;
+
+EnterExpressionEvaluationContext Ctx(
+getSema(), Context, nullptr,
+Sema::ExpressionEvaluationContextRecord::EK_Other);

cor3ntin wrote:

You are right, it's nicer this way, thanks.

https://github.com/llvm/llvm-project/pull/91939
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Ensure ``if consteval`` consititute an immediate function context (PR #91939)

2024-05-13 Thread Erich Keane via cfe-commits

https://github.com/erichkeane approved this pull request.


https://github.com/llvm/llvm-project/pull/91939
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Ensure ``if consteval`` consititute an immediate function context (PR #91939)

2024-05-13 Thread via cfe-commits

https://github.com/cor3ntin closed 
https://github.com/llvm/llvm-project/pull/91939
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits