On 3/25/25 11:43 AM, yxj-github-437 wrote:
This patch would like to avoid the ICE when template lambdas call with
default parameters in unevaluated context. The bug is the same as
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119385. For example as blow:

      1   | template <class T>
      2   | void foo(T x) {
      3   |   sizeof []<int=0>(T=x) { return 0; }();
      4   | }
      5   |
      6   | void test {
      7   |   foo(0);
      8   | }

when compile with -fsyntax-only -std=c++20, it will have ICE similar as below

test.cc: In instantiation of 'void foo(T) [with T = int]':
test.cc:7:6:   required from here
      6 |   foo(0);
        |   ~~~^~~
test.cc:3:38: internal compiler error: in tsubst_expr, at cp/pt.cc:21919
      2 |   sizeof []<int=0>(T=x) { return 0; }();
        |          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~

And if without the template code `<int=0>`, the code will pass compile, it's 
wrong.

When parsing lambda, the sizeof will affect the lambda internal unevaluated 
operand
being handled. So consider save/restore cp_unevaluated_operand.

gcc/cp/ChangeLog:

        * parser.cc (cp_parser_lambda_expression): Save/restore
        cp_unevaluated_operand when parser lambda.

gcc/testsuite/ChangeLog:

        * g++.dg/cpp2a/lambda-uneval25.C: New test.
---
   gcc/cp/parser.cc                             |  4 ++++
   gcc/testsuite/g++.dg/cpp2a/lambda-uneval25.C | 11 +++++++++++
   2 files changed, 15 insertions(+)
   create mode 100644 gcc/testsuite/g++.dg/cpp2a/lambda-uneval25.C

diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 57a461042bf..9cc51f57fa7 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -11754,6 +11754,8 @@ cp_parser_lambda_expression (cp_parser* parser)
       /* Inside the class, surrounding template-parameter-lists do not apply.  
*/
       unsigned int saved_num_template_parameter_lists
           = parser->num_template_parameter_lists;
+    /* Inside the lambda, outside unevaluated context do not apply.   */
+    int saved_cp_unevaluated_operand = cp_unevaluated_operand;

Instead of following the surrounding pattern, please use cp_evaluated.
That avoids the need for any change in the other two places.

OK, I've replace it with cp_evaluated.

Pushed, thanks. I removed an extra space in the comment and adjusted the commit message to fit in 75 columns.

Jason

Reply via email to