[Bug c++/97975] [8/9/10/11 Regression] ICE unexpected expression '(int)A< >::b' of kind implicit_conv_expr

2020-12-02 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97975

--- Comment #3 from CVS Commits  ---
The master branch has been updated by Marek Polacek :

https://gcc.gnu.org/g:69bf1c7d5ee21392334f1982d1b40c38e103bbd4

commit r11-5678-g69bf1c7d5ee21392334f1982d1b40c38e103bbd4
Author: Marek Polacek 
Date:   Tue Dec 1 10:39:08 2020 -0500

c++: Fix ICE with inline variable in template [PR97975]

In this test, we have

  static inline const int c = b;

in a class template, and we call store_init_value as usual.  There, the
value is

  IMPLICIT_CONV_EXPR(b)

which is is_nondependent_static_init_expression but isn't
is_nondependent_constant_expression (they only differ in STRICT).
We call fold_non_dependent_expr, but that just returns the expression
because it only instantiates is_nondependent_constant_expression
expressions.  Since we're not checking the initializer of a constexpr
variable, we go on to call maybe_constant_init, whereupon we crash
because it tries to evaluate all is_nondependent_static_init_expression
expressions, which our value is, but it still contains a template code.

I think the fix is to call fold_non_dependent_init instead of
maybe_constant_init, and only call fold_non_dependent_expr on the
"this is a constexpr variable" path so as to avoid instantiating twice
in a row.  Outside a template this should also avoid evaluating the
value twice.

gcc/cp/ChangeLog:

PR c++/97975
* constexpr.c (fold_non_dependent_init): Add a tree parameter.
Use it.
* cp-tree.h (fold_non_dependent_init): Add a tree parameter with
a default value.
* typeck2.c (store_init_value): Call fold_non_dependent_expr
only when checking the initializer for constexpr variables.
Call fold_non_dependent_init instead of maybe_constant_init.

gcc/testsuite/ChangeLog:

PR c++/97975
* g++.dg/cpp1z/inline-var8.C: New test.

[Bug c++/97975] [8/9/10/11 Regression] ICE unexpected expression '(int)A< >::b' of kind implicit_conv_expr

2020-11-30 Thread mpolacek at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97975

Marek Polacek  changed:

   What|Removed |Added

   Priority|P3  |P2

[Bug c++/97975] [8/9/10/11 Regression] ICE unexpected expression '(int)A< >::b' of kind implicit_conv_expr

2020-11-30 Thread mpolacek at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97975

Marek Polacek  changed:

   What|Removed |Added

 CC||mpolacek at gcc dot gnu.org
   Assignee|unassigned at gcc dot gnu.org  |mpolacek at gcc dot 
gnu.org
   Target Milestone|--- |8.5
 Status|NEW |ASSIGNED
Summary|ICE unexpected expression   |[8/9/10/11 Regression] ICE
   |'(int)A<|unexpected expression
   ||'(int)A<
   |>::b' of kind   |
   |implicit_conv_expr  |>::b' of kind
   ||implicit_conv_expr

--- Comment #2 from Marek Polacek  ---
Started with r249382, actually.  I think I have a patch.