diff mbox series

[pushed] c++: generic lambda and -fsanitize=vla-bound [PR93822]

Message ID 20200501175707.7958-1-jason@redhat.com
State New
Headers show
Series [pushed] c++: generic lambda and -fsanitize=vla-bound [PR93822] | expand

Commit Message

Jason Merrill May 1, 2020, 5:57 p.m. UTC
Within the generic lambda the VLA capture proxy VAR_DECL has DECL_VALUE_EXPR
which is a NOP_EXPR to the VLA type of the proxy.  The problem here was that
when instantiating we were tsubsting that type twice, once for the type of
the DECL and once for the type of the NOP_EXPR, and getting two
different (though equivalent) types.  Then gimplify_type_sizes fixed up the
type of the DECL, but that didn't affect the type of the NOP_EXPR, leading
to sadness.

Fixed by directly reusing the type from the DECL.

Tested x86_64-pc-linux-gnu, applying to trunk.

gcc/cp/ChangeLog
2020-05-01  Jason Merrill  <jason@redhat.com>

	PR c++/93822
	* pt.c (tsubst_decl): Make sure DECL_VALUE_EXPR continues to have
	the same type as the variable.
---
 gcc/cp/pt.c | 9 +++++++++
 1 file changed, 9 insertions(+)


base-commit: afb9b7108104a73e8ac7a9b8e6875870e5ca4bbb
diff mbox series

Patch

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index d28585efd17..9332865cf46 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -14609,6 +14609,11 @@  tsubst_decl (tree t, tree args, tsubst_flags_t complain)
 	    if (DECL_HAS_VALUE_EXPR_P (t))
 	      {
 		tree ve = DECL_VALUE_EXPR (t);
+		/* If the DECL_VALUE_EXPR is converted to the declared type,
+		   preserve the identity so that gimplify_type_sizes works.  */
+		bool nop = (TREE_CODE (ve) == NOP_EXPR);
+		if (nop)
+		  ve = TREE_OPERAND (ve, 0);
 		ve = tsubst_expr (ve, args, complain, in_decl,
 				  /*constant_expression_p=*/false);
 		if (REFERENCE_REF_P (ve))
@@ -14616,6 +14621,10 @@  tsubst_decl (tree t, tree args, tsubst_flags_t complain)
 		    gcc_assert (TYPE_REF_P (type));
 		    ve = TREE_OPERAND (ve, 0);
 		  }
+		if (nop)
+		  ve = build_nop (type, ve);
+		else
+		  gcc_checking_assert (TREE_TYPE (ve) == type);
 		SET_DECL_VALUE_EXPR (r, ve);
 	      }
 	    if (CP_DECL_THREAD_LOCAL_P (r)