This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: C++ PATCH for c++/85847, ICE with template_id_expr in new()
- From: Jason Merrill <jason at redhat dot com>
- To: Marek Polacek <polacek at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 23 May 2018 12:45:11 -0400
- Subject: Re: C++ PATCH for c++/85847, ICE with template_id_expr in new()
- References: <20180523134640.GB8190@redhat.com>
On Wed, May 23, 2018 at 9:46 AM, Marek Polacek <polacek@redhat.com> wrote:
> The diagnostic code in build_new{,_1} was using maybe_constant_value to fold
> the array length, but that breaks while parsing a template, because we might
> then leak template codes to the constexpr machinery.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk/8?
>
> 2018-05-23 Marek Polacek <polacek@redhat.com>
>
> PR c++/85847
> * init.c (build_new_1): Use fold_non_dependent_expr.
> (build_new): Likewise.
>
> * g++.dg/cpp0x/new3.C: New test.
>
> @@ -2860,7 +2860,7 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
> /* Lots of logic below. depends on whether we have a constant number of
> elements, so go ahead and fold it now. */
> if (outer_nelts)
> - outer_nelts = maybe_constant_value (outer_nelts);
> + outer_nelts = fold_non_dependent_expr (outer_nelts);
If outer_nelts is non-constant, this will mean that it ends up
instantiated but still non-constant, which can lead to problems when
the result is used in building up other expressions.
I think we want to put the result of folding in a separate variable
for use with things that want to know about a constant size, and keep
the original outer_nelts for use in building outer_nelts_check.
> /* Try to determine the constant value only for the purposes
> of the diagnostic below but continue to use the original
> value and handle const folding later. */
> - const_tree cst_nelts = maybe_constant_value (nelts);
> + const_tree cst_nelts = fold_non_dependent_expr (nelts);
...like we do here.
Jason