diff options
author | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2016-09-12 20:18:16 +0000 |
---|---|---|
committer | Bernd Edlinger <edlinger@gcc.gnu.org> | 2016-09-12 20:18:16 +0000 |
commit | 54dcdb88954b1192b004f8b91fc17a42765c20eb (patch) | |
tree | 06828e718304e9c4c4e9aa0de02496b72d3bff1b /gcc/c/c-parser.c | |
parent | a313485bbdcdee77b1bf891823f9da8984d76bcc (diff) | |
download | gcc-54dcdb88954b1192b004f8b91fc17a42765c20eb.zip gcc-54dcdb88954b1192b004f8b91fc17a42765c20eb.tar.gz gcc-54dcdb88954b1192b004f8b91fc17a42765c20eb.tar.bz2 |
re PR c++/77496 (ICE in instantiate_type, at cp/class.c:8270)
gcc/c-family:
2016-09-12 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR c++/77496
* c-common.c (warn_for_omitted_condop): Also warn for boolean data.
gcc/c:
2016-09-12 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR c++/77496
* c-parser.c (c_parser_conditional_expression): Pass the rightmost
COMPOUND_EXPR to warn_for_omitted_condop.
gcc/cp:
2016-09-12 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR c++/77496
* call.c (build_conditional_expr_1): Call warn_for_omitted_condop.
* class.c (instantiate_type): Look through the SAVE_EXPR.
gcc/testsuite:
2016-09-12 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR c++/77496
* c-c++-common/warn-ommitted-condop.c: Add more test cases.
* g++.dg/ext/pr77496.C: New test.
* g++.dg/warn/pr77496.C: New test.
From-SVN: r240098
Diffstat (limited to 'gcc/c/c-parser.c')
-rw-r--r-- | gcc/c/c-parser.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 0aba51c..a304424 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -6425,14 +6425,17 @@ c_parser_conditional_expression (c_parser *parser, struct c_expr *after, tree eptype = NULL_TREE; middle_loc = c_parser_peek_token (parser)->location; - pedwarn (middle_loc, OPT_Wpedantic, + pedwarn (middle_loc, OPT_Wpedantic, "ISO C forbids omitting the middle term of a ?: expression"); - warn_for_omitted_condop (middle_loc, cond.value); if (TREE_CODE (cond.value) == EXCESS_PRECISION_EXPR) { eptype = TREE_TYPE (cond.value); cond.value = TREE_OPERAND (cond.value, 0); } + tree e = cond.value; + while (TREE_CODE (e) == COMPOUND_EXPR) + e = TREE_OPERAND (e, 1); + warn_for_omitted_condop (middle_loc, e); /* Make sure first operand is calculated only once. */ exp1.value = c_save_expr (default_conversion (cond.value)); if (eptype) |