[C++ PATCH v2] PR c++/93324 - ICE with -Wall on constexpr if.
Jason Merrill
jason@redhat.com
Wed Jan 22 03:40:00 GMT 2020
On 1/19/20 4:18 PM, Marek Polacek wrote:
> On Sun, Jan 19, 2020 at 10:00:42PM +0100, Jakub Jelinek wrote:
>> On Sun, Jan 19, 2020 at 03:34:48PM -0500, Marek Polacek wrote:
>>> Bootstrapped/regtested on x86_64-linux, ok for trunk?
>>>
>>> * semantics.c (is_std_constant_evaluated_p): Check fndecl.
>>>
>>> * g++.dg/cpp1z/constexpr-if33.C: New test.
>>> ---
>>> gcc/cp/semantics.c | 4 ++--
>>> gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C | 16 ++++++++++++++++
>>> 2 files changed, 18 insertions(+), 2 deletions(-)
>>> create mode 100644 gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C
>>>
>>> diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
>>> index 3669b247e34..9051a2863e0 100644
>>> --- a/gcc/cp/semantics.c
>>> +++ b/gcc/cp/semantics.c
>>> @@ -734,8 +734,8 @@ is_std_constant_evaluated_p (tree fn)
>>> return false;
>>>
>>> tree fndecl = cp_get_callee_fndecl_nofold (fn);
>>> - if (fndecl_built_in_p (fndecl, CP_BUILT_IN_IS_CONSTANT_EVALUATED,
>>> - BUILT_IN_FRONTEND))
>>> + if (fndecl && fndecl_built_in_p (fndecl, CP_BUILT_IN_IS_CONSTANT_EVALUATED,
>>> + BUILT_IN_FRONTEND))
>>> return true;
>>>
>>> if (!decl_in_std_namespace_p (fndecl))
>>
>> Shouldn't it instead do
>> if (fndecl == NULL_TREE)
>> return false;
>> before the fndecl_built_in_p check?
>>
>> While decl_in_std_namespace_p apparently will return false for NULL
>> argument, relying on that is werid.
>
> Can do that, too.
>
> -- >8 --
> This is a crash with constexpr if, when trying to see if the call in
> the if-statement is std::is_constant_evaluated.
>
> cp_get_callee_fndecl_nofold can return NULL_TREE and fndecl_built_in_p
> doesn't expect to get a null tree, so check FNDECL first.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
OK.
> * semantics.c (is_std_constant_evaluated_p): Check fndecl.
>
> * g++.dg/cpp1z/constexpr-if33.C: New test.
> ---
> gcc/cp/semantics.c | 3 +++
> gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C | 16 ++++++++++++++++
> 2 files changed, 19 insertions(+)
> create mode 100644 gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C
>
> diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
> index 3669b247e34..3b88f1520bc 100644
> --- a/gcc/cp/semantics.c
> +++ b/gcc/cp/semantics.c
> @@ -734,6 +734,9 @@ is_std_constant_evaluated_p (tree fn)
> return false;
>
> tree fndecl = cp_get_callee_fndecl_nofold (fn);
> + if (fndecl == NULL_TREE)
> + return false;
> +
> if (fndecl_built_in_p (fndecl, CP_BUILT_IN_IS_CONSTANT_EVALUATED,
> BUILT_IN_FRONTEND))
> return true;
> diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C
> new file mode 100644
> index 00000000000..e5ef659932b
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C
> @@ -0,0 +1,16 @@
> +// PR c++/93324 - ICE with -Wall on constexpr if.
> +// { dg-do compile { target c++17 } }
> +// { dg-options "-Wall" }
> +
> +struct {
> + template <int>
> + static constexpr bool a() { return 0; }
> +} e;
> +
> +template <typename>
> +void d()
> +{
> + auto c(e);
> + using b = decltype(c);
> + if constexpr (b::a<2>());
> +}
>
> base-commit: bcfc2227c556f2801a657ce3007374732baa8333
>
More information about the Gcc-patches
mailing list