re PR c/92088 (aggregates with VLAs and nested functions are broken)

2019-11-20  Richard Biener  <rguenther@suse.de>

	PR c/92088
	c/
	* c-decl.c (grokdeclarator): Prevent inlining of nested
	function with VLA arguments.

	* builtins.c (compute_objsize): Deal with VLAs.

	* gcc.dg/torture/pr92088-1.c: New testcase.
	* gcc.dg/torture/pr92088-2.c: Likewise.

From-SVN: r278477
This commit is contained in:
Richard Biener 2019-11-20 07:33:19 +00:00 committed by Richard Biener
parent 54bf2539c5
commit 3e00ba47b9
7 changed files with 75 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2019-11-20 Richard Biener <rguenther@suse.de>
PR c/92088
* builtins.c (compute_objsize): Deal with VLAs.
2019-11-19 Pat Haugen <pthaugen@us.ibm.com> 2019-11-19 Pat Haugen <pthaugen@us.ibm.com>
* config/rs6000/rs6000.c (move_to_end_of_ready): New, factored out * config/rs6000/rs6000.c (move_to_end_of_ready): New, factored out

View File

@ -3707,7 +3707,8 @@ compute_objsize (tree dest, int ostype, tree *pdecl /* = NULL */)
if (DECL_P (ref)) if (DECL_P (ref))
{ {
*pdecl = ref; *pdecl = ref;
return DECL_SIZE_UNIT (ref); if (tree size = DECL_SIZE_UNIT (ref))
return TREE_CODE (size) == INTEGER_CST ? size : NULL_TREE;
} }
tree type = TREE_TYPE (dest); tree type = TREE_TYPE (dest);

View File

@ -1,3 +1,9 @@
2019-11-20 Richard Biener <rguenther@suse.de>
PR c/92088
* c-decl.c (grokdeclarator): Prevent inlining of nested
function with VLA arguments.
2019-11-20 Joseph Myers <joseph@codesourcery.com> 2019-11-20 Joseph Myers <joseph@codesourcery.com>
* c-decl.c (c_warn_type_attributes): New function. * c-decl.c (c_warn_type_attributes): New function.

View File

@ -7405,6 +7405,23 @@ grokdeclarator (const struct c_declarator *declarator,
"no linkage"); "no linkage");
} }
/* For nested functions disqualify ones taking VLAs by value
from inlining since the middle-end cannot deal with this.
??? We should arrange for those to be passed by reference
with emitting the copy on the caller side in the frontend. */
if (storage_class == csc_none
&& TREE_CODE (type) == FUNCTION_TYPE)
for (tree al = TYPE_ARG_TYPES (type); al; al = TREE_CHAIN (al))
{
tree arg = TREE_VALUE (al);
if (arg != error_mark_node
&& C_TYPE_VARIABLE_SIZE (arg))
{
DECL_UNINLINABLE (decl) = 1;
break;
}
}
/* Record `register' declaration for warnings on & /* Record `register' declaration for warnings on &
and in case doing stupid register allocation. */ and in case doing stupid register allocation. */

View File

@ -1,3 +1,9 @@
2019-11-20 Richard Biener <rguenther@suse.de>
PR c/92088
* gcc.dg/torture/pr92088-1.c: New testcase.
* gcc.dg/torture/pr92088-2.c: Likewise.
2019-11-20 Paolo Carlini <paolo.carlini@oracle.com> 2019-11-20 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/warn/multiple-sign-compare-warn-1.C: New. * g++.dg/warn/multiple-sign-compare-warn-1.C: New.

View File

@ -0,0 +1,22 @@
/* { dg-do run } */
int __attribute__((noipa))
g (char *p)
{
return p[9];
}
int main (int argc, char **argv)
{
struct S {
char toto[argc + 16];
};
int f (struct S arg) {
__builtin_strcpy(arg.toto, "helloworld");
return g (arg.toto);
}
struct S bob;
__builtin_strcpy(bob.toto, "coucoucoucou");
if (f(bob) != 'd' || __builtin_strcmp (bob.toto, "coucoucoucou"))
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,17 @@
/* { dg-do compile } */
void foo(int n)
{
struct X { int a[n]; } y;
struct X baz (struct X x)
{
x.a[0] = 1;
return x;
}
y.a[0] = 0;
y = baz(y);
if (y.a[0] != 1)
__builtin_abort ();
}