On Tue, 7 Jul 2020, Patrick Palka wrote:
> We are ICEing in the testcase below because we pass the
> yet-uninstantiated class type A<int> of the PARM_DECL b to
> is_really_empty_class from potential_rvalue_constant_expression when
> parsing the requirement t += b.
>
> This patch fixes the ICE by guarding the problematic call to
> is_really_empty_class with a COMPLETE_TYPE_P check, which should also
> subsume the existing dependent_type_p check.
>
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK to
> commit to trunk and to the 10 branch?
Oops, the regression is not present on the 10 branch so this fix wouldn't
need backporting.
>
> gcc/cp/ChangeLog:
>
> PR c++/95497
> * constexpr.c (potential_constant_expression_1): When
> processing_template_decl, check COMPLETE_TYPE_P before calling
> is_really_empty_class.
>
> gcc/testsuite/ChangeLog:
>
> PR c++/95497
> * g++.dg/cpp2a/concepts-pr95497.C: New test.
> ---
> gcc/cp/constexpr.c | 2 +-
> gcc/testsuite/g++.dg/cpp2a/concepts-pr95497.C | 12 ++++++++++++
> 2 files changed, 13 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-pr95497.C
>
> diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
> index 1939166e907..ff78ebda2dc 100644
> --- a/gcc/cp/constexpr.c
> +++ b/gcc/cp/constexpr.c
> @@ -7443,7 +7443,7 @@ potential_constant_expression_1 (tree t, bool
> want_rval, bool strict, bool now,
> if (now && want_rval)
> {
> tree type = TREE_TYPE (t);
> - if (dependent_type_p (type)
> + if ((processing_template_decl && !COMPLETE_TYPE_P (type))
> || is_really_empty_class (type, /*ignore_vptr*/false))
> /* An empty class has no data to read. */
> return true;
> diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-pr95497.C
> b/gcc/testsuite/g++.dg/cpp2a/concepts-pr95497.C
> new file mode 100644
> index 00000000000..4d7718ad5e8
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-pr95497.C
> @@ -0,0 +1,12 @@
> +// PR c++/95497
> +// { dg-do compile { target c++20 } }
> +
> +template <typename T>
> +struct A{};
> +
> +template <typename T>
> +concept c =
> + requires(T t, A<int> b) // note that A<int> is independent of T
> + {
> + { t += b };
> + };
> --
> 2.27.0.203.gf402ea6816
>
>