On Sat, Oct 31, 2020 at 10:09:32AM +0000, Iain Sandoe wrote:
> Hi Marek,
> 
> Marek Polacek via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
> 
> > On Wed, Oct 28, 2020 at 02:46:36PM -0400, Jason Merrill wrote:
> >> On 10/28/20 2:00 PM, Marek Polacek wrote:
> >>> On Tue, Oct 27, 2020 at 01:36:30PM -0400, Jason Merrill wrote:
> >>>> On 10/24/20 6:52 PM, Marek Polacek wrote:
> >>>>> Here, in r11-155, I changed the call to uses_template_parms to
> >>>>> type_dependent_expression_p_push to avoid a crash in C++98 in
> >>>>> value_dependent_expression_p on a non-constant expression.  But that
> >>>>> prompted a host of complaints that we now warn for value-dependent
> >>>>> expressions in templates.  Those warnings are technically valid, but
> >>>>> people still don't want them because they're awkward to avoid.  So let's
> >>>>> partially revert my earlier fix and make sure that we don't ICE in
> >>>>> value_dependent_expression_p by checking potential_constant_expression
> >>>>> first.
> >>>>> 
> >>>>> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/10?
> >>>>> 
> >>>>> gcc/cp/ChangeLog:
> >>>>> 
> >>>>>         PR c++/96675
> >>>>>         PR c++/96742
> >>>>>         * pt.c (tsubst_copy_and_build): Call uses_template_parms 
> >>>>> instead of
> >>>>>         type_dependent_expression_p_push.  Only call uses_template_parms
> >>>>>         for expressions that are potential_constant_expression.
> >>>>> 
> >>>>> gcc/testsuite/ChangeLog:
> >>>>> 
> >>>>>         PR c++/96675
> >>>>>         PR c++/96742
> >>>>>         * g++.dg/warn/Wdiv-by-zero-3.C: Turn dg-warning into dg-bogus.
> >>>>>         * g++.dg/warn/Wtautological-compare3.C: New test.
> >>>>>         * g++.dg/warn/Wtype-limits5.C: New test.
> >>>>>         * g++.old-deja/g++.pt/crash10.C: Remove dg-warning.
> >>>>> —
> > 
> >>> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/10?
> >> 
> >> OK.
> > 
> > Thanks,
> 
> This regresses Objective-C++ template-4.mm with an ICE (because we don’t have 
> a
> check for message_send_expr, which can’t be constexpr).

Sorry for failing to test Objective-C++ properly.

> I am testing the following fix (which is mostly Objective-C-local), but open 
> to alternate
> solutions.  Personally, I prefer to avoid double-negatives in code but 
> because of the 
> fallthrough to the sorry case, it seems hard to avoid.
> 
> OK for master if testing is sucessful?
> (I assume we will also need to do the same on 10.x if you backported already)
> 
> cheers
> Iain
> 
> ========
> 
> [PATCH] Objective-C++ : Fix ICE in potential_constant_expression_1.
> 
> We cannot, as things stand, handle Objective-C tree codes in
> the switch and deal with this by calling out to a function that
> has a dummy version when Objective-C is not enabled.
> 
> Because of the way the logic works (with a fall through to a
> 'sorry' in case of unhandled expressions), the function reports
> cases that are known to be unsuitable for constant exprs. The
> dummy function always reports 'false' and thus will fall through
> to the 'sorry'.
> 
> gcc/c-family/ChangeLog:
> 
>       * c-objc.h (objc_non_constant_expr_p): New.
>       * stub-objc.c (objc_non_constant_expr_p): New.
> 
> gcc/cp/ChangeLog:
> 
>       * constexpr.c (potential_constant_expression_1): Handle
>       expressions known to be non-constant for Objective-C.
> 
> gcc/objc/ChangeLog:
> 
>       * objc-act.c (objc_non_constant_expr_p): New.
> ---
>  gcc/c-family/c-objc.h    |  1 +
>  gcc/c-family/stub-objc.c |  6 ++++++
>  gcc/cp/constexpr.c       |  2 +-
>  gcc/objc/objc-act.c      | 16 +++++++++++++++-
>  4 files changed, 23 insertions(+), 2 deletions(-)
> 
> diff --git a/gcc/c-family/c-objc.h b/gcc/c-family/c-objc.h
> index 6025283e5cf..4577e4f1c7f 100644
> --- a/gcc/c-family/c-objc.h
> +++ b/gcc/c-family/c-objc.h
> @@ -101,6 +101,7 @@ extern void objc_add_synthesize_declaration (location_t, 
> tree);
>  extern void objc_add_dynamic_declaration (location_t, tree);
>  extern const char * objc_maybe_printable_name (tree, int);
>  extern bool objc_is_property_ref (tree);
> +extern bool objc_non_constant_expr_p (tree);
>  extern bool objc_string_ref_type_p (tree);
>  extern void objc_check_format_arg (tree, tree);
>  extern void objc_finish_function (void);
> diff --git a/gcc/c-family/stub-objc.c b/gcc/c-family/stub-objc.c
> index c30f0b3c67d..9ced68b2b3e 100644
> --- a/gcc/c-family/stub-objc.c
> +++ b/gcc/c-family/stub-objc.c
> @@ -331,6 +331,12 @@ objc_is_property_ref (tree ARG_UNUSED (node))
>    return 0;
>  }
>  
> +bool
> +objc_non_constant_expr_p (tree ARG_UNUSED (node))

In new code we can just omit the name of the parameter: (tree)

I have no other comments otherwise.  I think you can go ahead with this
change.  Thanks.

Marek

Reply via email to