[gcc(refs/vendors/ARM/heads/arm-perf-staging)] c++: generic lambda and -fsanitize=vla-bound [PR93822]

Tamar Christina tnfchris@gcc.gnu.org
Fri Jul 17 15:16:04 GMT 2020


https://gcc.gnu.org/g:4cee81365ad32ef947f500e4cf4b3514d88236c9

commit 4cee81365ad32ef947f500e4cf4b3514d88236c9
Author: Jason Merrill <jason@redhat.com>
Date:   Mon May 25 18:04:39 2020 -0400

    c++: generic lambda and -fsanitize=vla-bound [PR93822]
    
    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.
    
    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.

Diff:
---
 gcc/cp/ChangeLog | 6 ++++++
 gcc/cp/pt.c      | 9 +++++++++
 2 files changed, 15 insertions(+)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 306ebf2c71f..a4fac193278 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2020-05-25  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.
+
 2020-05-24  Iain Sandoe  <iain@sandoe.co.uk>
 
 	Backported from mainline
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index b8f03d18541..e025dd7a388 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)


More information about the Gcc-cvs mailing list