re PR middle-end/30473 (Internal Compiler Error with a sprintf with few arguments for format %s)

PR middle-end/30473
	* builtins.c (fold_builtin_sprintf): Do not attempt to optimize
	sprintf (str, "%s").  Do not optimize sprintf (str, "nopercent", p++).

	* gcc.dg/pr30473.c: New test.
	* gcc.c-torture/execute/20070201-1.c: New test.

From-SVN: r121495
This commit is contained in:
Jakub Jelinek 2007-02-02 13:21:13 +01:00 committed by Jakub Jelinek
parent b198261f9c
commit 6b01cd54dd
5 changed files with 55 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2007-02-02 Jakub Jelinek <jakub@redhat.com>
PR middle-end/30473
* builtins.c (fold_builtin_sprintf): Do not attempt to optimize
sprintf (str, "%s"). Do not optimize sprintf (str, "nopercent", p++).
2007-02-02 Maxim Kuvyrkov <mkuvyrkov@ispras.ru>
* sched-int.h (ds_to_dk, dk_to_ds): Declare functions.

View File

@ -10553,6 +10553,7 @@ fold_builtin_sprintf (tree arglist, int ignored)
/* Get the destination string and the format specifier. */
dest = TREE_VALUE (arglist);
fmt = TREE_VALUE (TREE_CHAIN (arglist));
arglist = TREE_CHAIN (TREE_CHAIN (arglist));
/* Check whether the format is a literal string constant. */
fmt_str = c_getstr (fmt);
@ -10573,6 +10574,10 @@ fold_builtin_sprintf (tree arglist, int ignored)
if (!fn)
return NULL_TREE;
/* Don't optimize sprintf (buf, "abc", ptr++). */
if (arglist)
return NULL_TREE;
/* Convert sprintf (str, fmt) into strcpy (str, fmt) when
'format' is known to contain no % formats. */
arglist = build_tree_list (NULL_TREE, fmt);
@ -10591,8 +10596,12 @@ fold_builtin_sprintf (tree arglist, int ignored)
if (!fn)
return NULL_TREE;
/* Don't crash on sprintf (str1, "%s"). */
if (!arglist)
return NULL_TREE;
/* Convert sprintf (str1, "%s", str2) into strcpy (str1, str2). */
orig = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
orig = TREE_VALUE (arglist);
arglist = build_tree_list (NULL_TREE, orig);
arglist = tree_cons (NULL_TREE, dest, arglist);
if (!ignored)

View File

@ -1,3 +1,9 @@
2007-02-02 Jakub Jelinek <jakub@redhat.com>
PR middle-end/30473
* gcc.dg/pr30473.c: New test.
* gcc.c-torture/execute/20070201-1.c: New test.
2007-02-01 Roger Sayle <roger@eyesopen.com>
* gfortran.dg/dependency_20.f90: New test case.

View File

@ -0,0 +1,20 @@
/* PR middle-end/30473 */
extern int sprintf (char *, const char *, ...);
extern void abort (void);
char *
foo (char *buf, char *p)
{
sprintf (buf, "abcde", p++);
return p;
}
int
main (void)
{
char buf[6];
if (foo (buf, &buf[2]) != &buf[3])
abort ();
return 0;
}

View File

@ -0,0 +1,13 @@
/* PR middle-end/30473 */
/* Make sure this doesn't ICE. */
/* { dg-do compile } */
/* { dg-options "-O2" } */
extern int sprintf (char *, const char *, ...);
void
foo (char *buf1, char *buf2)
{
sprintf (buf1, "%s", "abcde");
sprintf (buf2, "%s");
}