+2001-01-24 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * c-parse.in (cast_expr): Move compound literals from here ...
+ (primary): ... to here. Use standard terminology "compound
+ literal" instead of "constructor expression".
+
2001-01-24 Joseph S. Myers <jsm28@cam.ac.uk>
* gcc.1, cpp.1: Regenerate.
type = groktypename ($2);
warn_strict_prototypes = SAVED_warn_strict_prototypes;
$$ = build_c_cast (type, $4); }
- | '(' typename ')' '{'
- { start_init (NULL_TREE, NULL, 0);
- $2 = groktypename ($2);
- really_start_incremental_init ($2); }
- initlist_maybe_comma '}' %prec UNARY
- { const char *name;
- tree result = pop_init_level (0);
- tree type = $2;
- finish_init ();
-
- if (pedantic && ! flag_isoc99)
- pedwarn ("ISO C89 forbids constructor expressions");
- if (TYPE_NAME (type) != 0)
- {
- if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
- name = IDENTIFIER_POINTER (TYPE_NAME (type));
- else
- name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
- }
- else
- name = "";
- $$ = result;
- if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type))
- {
- int failure = complete_array_type (type, $$, 1);
- if (failure)
- abort ();
- }
- }
;
expr_no_commas:
| CONSTANT
| string
{ $$ = combine_strings ($1); }
+ | '(' typename ')' '{'
+ { start_init (NULL_TREE, NULL, 0);
+ $2 = groktypename ($2);
+ really_start_incremental_init ($2); }
+ initlist_maybe_comma '}' %prec UNARY
+ { const char *name;
+ tree result = pop_init_level (0);
+ tree type = $2;
+ finish_init ();
+
+ if (pedantic && ! flag_isoc99)
+ pedwarn ("ISO C89 forbids compound literals");
+ if (TYPE_NAME (type) != 0)
+ {
+ if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
+ name = IDENTIFIER_POINTER (TYPE_NAME (type));
+ else
+ name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
+ }
+ else
+ name = "";
+ $$ = result;
+ if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type))
+ {
+ int failure = complete_array_type (type, $$, 1);
+ if (failure)
+ abort ();
+ }
+ }
| '(' expr ')'
{ char class = TREE_CODE_CLASS (TREE_CODE ($2));
if (class == 'e' || class == '1'
--- /dev/null
+/* Origin: testcase from Joseph Myers <jsm28@cam.ac.uk>, problem pointed
+ out in a post to comp.std.c
+ <980283801.3063.0.nnrp-07.c2deb1c2@news.demon.co.uk>
+ by Dibyendu Majumdar <dibyendu@mazumdar.demon.co.uk>.
+ Compound literals should be parsed as postfix expressions, rather than
+ as cast expressions. In particular, they are valid operands of sizeof. */
+
+struct s { int a; int b; };
+char x[((sizeof (struct s){ 1, 2 }) == sizeof (struct s)) ? 1 : -1];