c++: Handle RAW_DATA_CST in unify [PR118390]

Message ID Z4EIo381uhPpRD6Y@tucnak
State New
Headers
Series c++: Handle RAW_DATA_CST in unify [PR118390] |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply

Commit Message

Jakub Jelinek Jan. 10, 2025, 11:46 a.m. UTC
  Hi!

The following patch on top of
https://gcc.gnu.org/pipermail/gcc-patches/2025-January/673177.html
(in review currently)
https://gcc.gnu.org/pipermail/gcc-patches/2024-December/672055.html
(acked but waiting for the former)
https://gcc.gnu.org/pipermail/gcc-patches/2025-January/672438.html
https://gcc.gnu.org/pipermail/gcc-patches/2025-January/672496.html
(waiting for review)
uses the new function introduced in the second patch to fix up
unify deduction of array sizes.

Ok for trunk?

2025-01-10  Jakub Jelinek  <jakub@redhat.com>

	PR c++/118390
	* cp-tree.h (count_ctor_elements): Declare.
	* call.cc (count_ctor_elements): No longer static.
	* pt.cc (unify): Use count_ctor_elements instead of
	CONSTRUCTOR_NELTS.

	* g++.dg/cpp/embed-20.C: New test.
	* g++.dg/cpp0x/pr118390.C: New test.


	Jakub
  

Comments

Jason Merrill Jan. 15, 2025, 5:17 p.m. UTC | #1
On 1/10/25 6:46 AM, Jakub Jelinek wrote:
> Hi!
> 
> The following patch on top of
> https://gcc.gnu.org/pipermail/gcc-patches/2025-January/673177.html
> (in review currently)
> https://gcc.gnu.org/pipermail/gcc-patches/2024-December/672055.html
> (acked but waiting for the former)
> https://gcc.gnu.org/pipermail/gcc-patches/2025-January/672438.html
> https://gcc.gnu.org/pipermail/gcc-patches/2025-January/672496.html
> (waiting for review)
> uses the new function introduced in the second patch to fix up
> unify deduction of array sizes.
> 
> Ok for trunk?

OK.

> 2025-01-10  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR c++/118390
> 	* cp-tree.h (count_ctor_elements): Declare.
> 	* call.cc (count_ctor_elements): No longer static.
> 	* pt.cc (unify): Use count_ctor_elements instead of
> 	CONSTRUCTOR_NELTS.
> 
> 	* g++.dg/cpp/embed-20.C: New test.
> 	* g++.dg/cpp0x/pr118390.C: New test.
> 
> --- gcc/cp/cp-tree.h.jj	2025-01-10 11:47:58.478841366 +0100
> +++ gcc/cp/cp-tree.h	2025-01-10 12:40:51.898875583 +0100
> @@ -6815,6 +6815,7 @@ extern tree type_decays_to			(tree);
>   extern tree extract_call_expr			(tree);
>   extern tree build_trivial_dtor_call		(tree, bool = false);
>   extern tristate ref_conv_binds_to_temporary	(tree, tree, bool = false);
> +extern unsigned HOST_WIDE_INT count_ctor_elements (tree);
>   extern tree build_user_type_conversion		(tree, tree, int,
>   						 tsubst_flags_t);
>   extern tree build_new_function_call		(tree, vec<tree, va_gc> **,
> --- gcc/cp/call.cc.jj	2025-01-10 11:49:42.155399433 +0100
> +++ gcc/cp/call.cc	2025-01-10 12:40:12.906413343 +0100
> @@ -4333,7 +4333,7 @@ has_non_trivial_temporaries (tree expr)
>   
>   /* Return number of initialized elements in CTOR.  */
>   
> -static unsigned HOST_WIDE_INT
> +unsigned HOST_WIDE_INT
>   count_ctor_elements (tree ctor)
>   {
>     unsigned HOST_WIDE_INT len = 0;
> --- gcc/cp/pt.cc.jj	2025-01-10 10:32:28.801729684 +0100
> +++ gcc/cp/pt.cc	2025-01-10 12:41:19.801491043 +0100
> @@ -25064,7 +25064,7 @@ unify (tree tparms, tree targs, tree par
>   	  && deducible_array_bound (TYPE_DOMAIN (parm)))
>   	{
>   	  /* Also deduce from the length of the initializer list.  */
> -	  tree max = size_int (CONSTRUCTOR_NELTS (arg));
> +	  tree max = size_int (count_ctor_elements (arg));
>   	  tree idx = compute_array_index_type (NULL_TREE, max, tf_none);
>   	  if (idx == error_mark_node)
>   	    return unify_invalid (explain_p);
> --- gcc/testsuite/g++.dg/cpp/embed-20.C.jj	2025-01-10 12:30:08.578762083 +0100
> +++ gcc/testsuite/g++.dg/cpp/embed-20.C	2025-01-10 12:29:29.882296675 +0100
> @@ -0,0 +1,14 @@
> +// PR c++/118390
> +// { dg-do compile { target c++11 } }
> +// { dg-options "" }
> +
> +template<typename T, int N>
> +constexpr int
> +foo (const T (&x)[N])
> +{
> +  return N;
> +}
> +
> +static_assert (foo ({
> +  #embed __FILE__ limit (64)
> +}) == 64, "");
> --- gcc/testsuite/g++.dg/cpp0x/pr118390.C.jj	2025-01-10 12:30:59.748055186 +0100
> +++ gcc/testsuite/g++.dg/cpp0x/pr118390.C	2025-01-10 12:31:34.681572583 +0100
> @@ -0,0 +1,23 @@
> +// PR c++/118390
> +// { dg-do compile { target c++11 } }
> +// { dg-options "" }
> +
> +template<typename T, int N>
> +constexpr int
> +foo (const T (&x)[N])
> +{
> +  return N;
> +}
> +
> +static_assert (foo ({
> +  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> +  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> +  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> +  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> +  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> +  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> +  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> +  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> +  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> +  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
> +}) == 160, "");
> 
> 	Jakub
>
  

Patch

--- gcc/cp/cp-tree.h.jj	2025-01-10 11:47:58.478841366 +0100
+++ gcc/cp/cp-tree.h	2025-01-10 12:40:51.898875583 +0100
@@ -6815,6 +6815,7 @@  extern tree type_decays_to			(tree);
 extern tree extract_call_expr			(tree);
 extern tree build_trivial_dtor_call		(tree, bool = false);
 extern tristate ref_conv_binds_to_temporary	(tree, tree, bool = false);
+extern unsigned HOST_WIDE_INT count_ctor_elements (tree);
 extern tree build_user_type_conversion		(tree, tree, int,
 						 tsubst_flags_t);
 extern tree build_new_function_call		(tree, vec<tree, va_gc> **,
--- gcc/cp/call.cc.jj	2025-01-10 11:49:42.155399433 +0100
+++ gcc/cp/call.cc	2025-01-10 12:40:12.906413343 +0100
@@ -4333,7 +4333,7 @@  has_non_trivial_temporaries (tree expr)
 
 /* Return number of initialized elements in CTOR.  */
 
-static unsigned HOST_WIDE_INT
+unsigned HOST_WIDE_INT
 count_ctor_elements (tree ctor)
 {
   unsigned HOST_WIDE_INT len = 0;
--- gcc/cp/pt.cc.jj	2025-01-10 10:32:28.801729684 +0100
+++ gcc/cp/pt.cc	2025-01-10 12:41:19.801491043 +0100
@@ -25064,7 +25064,7 @@  unify (tree tparms, tree targs, tree par
 	  && deducible_array_bound (TYPE_DOMAIN (parm)))
 	{
 	  /* Also deduce from the length of the initializer list.  */
-	  tree max = size_int (CONSTRUCTOR_NELTS (arg));
+	  tree max = size_int (count_ctor_elements (arg));
 	  tree idx = compute_array_index_type (NULL_TREE, max, tf_none);
 	  if (idx == error_mark_node)
 	    return unify_invalid (explain_p);
--- gcc/testsuite/g++.dg/cpp/embed-20.C.jj	2025-01-10 12:30:08.578762083 +0100
+++ gcc/testsuite/g++.dg/cpp/embed-20.C	2025-01-10 12:29:29.882296675 +0100
@@ -0,0 +1,14 @@ 
+// PR c++/118390
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template<typename T, int N>
+constexpr int
+foo (const T (&x)[N])
+{
+  return N;
+}
+
+static_assert (foo ({
+  #embed __FILE__ limit (64)
+}) == 64, "");
--- gcc/testsuite/g++.dg/cpp0x/pr118390.C.jj	2025-01-10 12:30:59.748055186 +0100
+++ gcc/testsuite/g++.dg/cpp0x/pr118390.C	2025-01-10 12:31:34.681572583 +0100
@@ -0,0 +1,23 @@ 
+// PR c++/118390
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template<typename T, int N>
+constexpr int
+foo (const T (&x)[N])
+{
+  return N;
+}
+
+static_assert (foo ({
+  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+}) == 160, "");