diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-04-03 11:17:44 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-04-03 11:17:44 +0200 |
commit | 4e7d7b3d5d5cefd5e19a736a83c3077f7c95baad (patch) | |
tree | ee1f834718a018ae1e4059bf0a7d4d879d20def1 /gcc/c | |
parent | e6c9d234044bae3de1941cb7d654dc9d3425fd1b (diff) | |
download | gcc-4e7d7b3d5d5cefd5e19a736a83c3077f7c95baad.zip gcc-4e7d7b3d5d5cefd5e19a736a83c3077f7c95baad.tar.gz gcc-4e7d7b3d5d5cefd5e19a736a83c3077f7c95baad.tar.bz2 |
re PR c/19449 (__builtin_constant_p cannot resolve to const when optimizing)
PR c/19449
* tree.h (force_folding_builtin_constant_p): New decl.
* builtins.c (force_folding_builtin_constant_p): New variable.
(fold_builtin_constant_p): Fold immediately also if
force_folding_builtin_constant_p.
* c-parser.c (c_parser_get_builtin_args): Add choose_expr_p
argument. If set, or it temporarily for parsing of the first
argument into force_folding_builtin_constant_p.
(c_parser_postfix_expression): Adjust callers.
* gcc.c-torture/execute/pr19449.c: New test.
From-SVN: r197393
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 15 |
2 files changed, 19 insertions, 4 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index a76fb3e..771a557 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,11 @@ +2013-04-03 Jakub Jelinek <jakub@redhat.com> + + PR c/19449 + * c-parser.c (c_parser_get_builtin_args): Add choose_expr_p + argument. If set, or it temporarily for parsing of the first + argument into force_folding_builtin_constant_p. + (c_parser_postfix_expression): Adjust callers. + 2013-03-21 Richard Biener <rguenther@suse.de> * c-objc-common.c (c_tree_printer): Use DECL_HAS_DEBUG_EXPR_P diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 2ae4622..f60f141 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -6114,11 +6114,13 @@ c_parser_alignof_expression (c_parser *parser) stores the arguments in CEXPR_LIST. */ static bool c_parser_get_builtin_args (c_parser *parser, const char *bname, - vec<c_expr_t, va_gc> **ret_cexpr_list) + vec<c_expr_t, va_gc> **ret_cexpr_list, + bool choose_expr_p) { location_t loc = c_parser_peek_token (parser)->location; vec<c_expr_t, va_gc> *cexpr_list; c_expr_t expr; + bool saved_force_folding_builtin_constant_p; *ret_cexpr_list = NULL; if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN)) @@ -6135,7 +6137,12 @@ c_parser_get_builtin_args (c_parser *parser, const char *bname, return true; } + saved_force_folding_builtin_constant_p + = force_folding_builtin_constant_p; + force_folding_builtin_constant_p |= choose_expr_p; expr = c_parser_expr_no_commas (parser, NULL); + force_folding_builtin_constant_p + = saved_force_folding_builtin_constant_p; vec_alloc (cexpr_list, 1); C_EXPR_APPEND (cexpr_list, expr); while (c_parser_next_token_is (parser, CPP_COMMA)) @@ -6509,7 +6516,7 @@ c_parser_postfix_expression (c_parser *parser) c_parser_consume_token (parser); if (!c_parser_get_builtin_args (parser, "__builtin_choose_expr", - &cexpr_list)) + &cexpr_list, true)) { expr.value = error_mark_node; break; @@ -6591,7 +6598,7 @@ c_parser_postfix_expression (c_parser *parser) c_parser_consume_token (parser); if (!c_parser_get_builtin_args (parser, "__builtin_complex", - &cexpr_list)) + &cexpr_list, false)) { expr.value = error_mark_node; break; @@ -6653,7 +6660,7 @@ c_parser_postfix_expression (c_parser *parser) c_parser_consume_token (parser); if (!c_parser_get_builtin_args (parser, "__builtin_shuffle", - &cexpr_list)) + &cexpr_list, false)) { expr.value = error_mark_node; break; |