diff options
author | Joseph Myers <jsm28@cam.ac.uk> | 2001-12-17 01:18:41 +0000 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2001-12-17 01:18:41 +0000 |
commit | 8d37a5c0db11afb1c4b6d578ad46d1dfb1213118 (patch) | |
tree | b0c444fe54bd3f1b332cc67c0727beaa08189268 /gcc | |
parent | cf6ede82ac9bf9fdd08be25e806e131ac9a8f47e (diff) | |
download | gcc-8d37a5c0db11afb1c4b6d578ad46d1dfb1213118.zip gcc-8d37a5c0db11afb1c4b6d578ad46d1dfb1213118.tar.gz gcc-8d37a5c0db11afb1c4b6d578ad46d1dfb1213118.tar.bz2 |
re PR c/5105 (compound literal patch broken with inlining)
* c-common.def (COMPOUND_LITERAL_EXPR): Contain a DECL_STMT, not
a DECL directly.
* c-common.h (COMPOUND_LITERAL_EXPR_DECL_STMT): New.
(COMPOUND_LITERAL_EXPR_DECL): Adjust definition.
* c-decl.c (build_compound_literal): Put the decl inside a
DECL_STMT.
* doc/c-tree.texi (COMPOUND_LITERAL_EXPR): Update documentation.
Fixes PR c/5105.
testsuite:
* gcc.c-torture/compile/20011217-1.c: New test.
From-SVN: r48085
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/c-common.def | 7 | ||||
-rw-r--r-- | gcc/c-common.h | 6 | ||||
-rw-r--r-- | gcc/c-decl.c | 4 | ||||
-rw-r--r-- | gcc/doc/c-tree.texi | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20011217-1.c | 20 |
7 files changed, 51 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e6d9be2..c17e1cf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2001-12-17 Joseph S. Myers <jsm28@cam.ac.uk> + + * c-common.def (COMPOUND_LITERAL_EXPR): Contain a DECL_STMT, not + a DECL directly. + * c-common.h (COMPOUND_LITERAL_EXPR_DECL_STMT): New. + (COMPOUND_LITERAL_EXPR_DECL): Adjust definition. + * c-decl.c (build_compound_literal): Put the decl inside a + DECL_STMT. + * doc/c-tree.texi (COMPOUND_LITERAL_EXPR): Update documentation. + Fixes PR c/5105. + 2001-12-16 Aldy Hernandez <aldyh@redhat.com> * config.gcc: Add powerpc-*-eabisimaltivec*. diff --git a/gcc/c-common.def b/gcc/c-common.def index 7840ce8..d9b14be 100644 --- a/gcc/c-common.def +++ b/gcc/c-common.def @@ -103,7 +103,8 @@ DEFTREECODE (CASE_LABEL, "case_label", 'e', 3) DEFTREECODE (STMT_EXPR, "stmt_expr", 'e', 1) /* A COMPOUND_LITERAL_EXPR represents a C99 compound literal. The - COMPOND_LITERAL_EXPR_DECL is the decl for the anonymous object - represented by the COMPOUND_LITERAL; the DECL_INITIAL of that - decl is the CONSTRUCTOR that initializes the compound literal. */ + COMPOND_LITERAL_EXPR_DECL_STMT is the a DECL_STMT containing the decl + for the anonymous object represented by the COMPOUND_LITERAL; + the DECL_INITIAL of that decl is the CONSTRUCTOR that initializes + the compound literal. */ DEFTREECODE (COMPOUND_LITERAL_EXPR, "compound_literal_expr", 'e', 1) diff --git a/gcc/c-common.h b/gcc/c-common.h index 514c448..61b8f84 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -637,9 +637,11 @@ extern tree strip_array_types PARAMS ((tree)); the given label statement. */ #define LABEL_STMT_LABEL(NODE) TREE_OPERAND (LABEL_STMT_CHECK (NODE), 0) -/* COMPOUND_LITERAL_EXPR accessor. */ -#define COMPOUND_LITERAL_EXPR_DECL(NODE) \ +/* COMPOUND_LITERAL_EXPR accessors. */ +#define COMPOUND_LITERAL_EXPR_DECL_STMT(NODE) \ TREE_OPERAND (COMPOUND_LITERAL_EXPR_CHECK (NODE), 0) +#define COMPOUND_LITERAL_EXPR_DECL(NODE) \ + DECL_STMT_DECL (COMPOUND_LITERAL_EXPR_DECL_STMT (NODE)) /* Nonzero if this SCOPE_STMT is for the beginning of a scope. */ #define SCOPE_BEGIN_P(NODE) \ diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 011624e..c7e1e0a 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -3836,6 +3836,7 @@ build_compound_literal (type, init) the COMPOUND_LITERAL_EXPR rather than added elsewhere as a DECL_STMT. */ tree decl = build_decl (VAR_DECL, NULL_TREE, type); tree complit; + tree stmt; DECL_EXTERNAL (decl) = 0; TREE_PUBLIC (decl) = 0; TREE_STATIC (decl) = (current_binding_level == global_binding_level); @@ -3855,7 +3856,8 @@ build_compound_literal (type, init) if (type == error_mark_node || !COMPLETE_TYPE_P (type)) return error_mark_node; - complit = build1 (COMPOUND_LITERAL_EXPR, TREE_TYPE (decl), decl); + stmt = build_stmt (DECL_STMT, decl); + complit = build1 (COMPOUND_LITERAL_EXPR, TREE_TYPE (decl), stmt); TREE_SIDE_EFFECTS (complit) = 1; layout_decl (decl, 0); diff --git a/gcc/doc/c-tree.texi b/gcc/doc/c-tree.texi index 4046d18..8d22647 100644 --- a/gcc/doc/c-tree.texi +++ b/gcc/doc/c-tree.texi @@ -2219,13 +2219,16 @@ Conceptually, before any initialization is done, the entire area of storage is initialized to zero. @item COMPOUND_LITERAL_EXPR +@findex COMPOUND_LITERAL_EXPR_DECL_STMT @findex COMPOUND_LITERAL_EXPR_DECL These nodes represent ISO C99 compound literals. The -@code{COMPOUND_LITERAL_EXPR_DECL} is an anonymous @code{VAR_DECL} for +@code{COMPOUND_LITERAL_EXPR_DECL_STMT} is a @code{DECL_STMT} +containing an anonymous @code{VAR_DECL} for the unnamed object represented by the compound literal; the @code{DECL_INITIAL} of that @code{VAR_DECL} is a @code{CONSTRUCTOR} representing the brace-enclosed list of initializers in the compound -literal. +literal. That anonymous @code{VAR_DECL} can also be accessed directly +by the @code{COMPOUND_LITERAL_EXPR_DECL} macro. @item SAVE_EXPR diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a838d6b..170ff3f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-12-17 Joseph S. Myers <jsm28@cam.ac.uk> + + * gcc.c-torture/compile/20011217-1.c: New test. + 2001-12-14 Aldy Hernandez <aldyh@redhat.com> * testsuite/gcc.dg/20011214-1.c: New. diff --git a/gcc/testsuite/gcc.c-torture/compile/20011217-1.c b/gcc/testsuite/gcc.c-torture/compile/20011217-1.c new file mode 100644 index 0000000..3e89ca0 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20011217-1.c @@ -0,0 +1,20 @@ +/* Test that the initializer of a compound literal is properly walked + when tree inlining. */ +/* Origin: PR c/5105 from <aj@suse.de>. */ + +typedef struct { long p; } pt; + +inline pt f (pt _p) +{ + long p = _p.p; + + return (pt) { (p) }; +} + +static int mmap_mem (void) +{ + pt p; + p = f (p); + + return 0; +} |