aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoseph Myers <jsm28@cam.ac.uk>2001-12-17 01:18:41 +0000
committerJoseph Myers <jsm28@gcc.gnu.org>2001-12-17 01:18:41 +0000
commit8d37a5c0db11afb1c4b6d578ad46d1dfb1213118 (patch)
treeb0c444fe54bd3f1b332cc67c0727beaa08189268 /gcc
parentcf6ede82ac9bf9fdd08be25e806e131ac9a8f47e (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/c-common.def7
-rw-r--r--gcc/c-common.h6
-rw-r--r--gcc/c-decl.c4
-rw-r--r--gcc/doc/c-tree.texi7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20011217-1.c20
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;
+}