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.

        Jakub

Reply via email to