diff options
author | Marek Polacek <polacek@redhat.com> | 2018-06-29 15:25:14 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2018-06-29 15:25:14 +0000 |
commit | dd2a449867efaef1d2daceadab823d638a7dabcf (patch) | |
tree | bb9860fbf06e673b0e34f75ede9a6e01137fa820 /gcc | |
parent | 1f2bb38a85710f650d1ea87f0765cb50e19c3212 (diff) | |
download | gcc-dd2a449867efaef1d2daceadab823d638a7dabcf.zip gcc-dd2a449867efaef1d2daceadab823d638a7dabcf.tar.gz gcc-dd2a449867efaef1d2daceadab823d638a7dabcf.tar.bz2 |
re PR c++/86184 (Conditional expression with omitted operand cannot use rvalue of type convertible to bool)
PR c++/86184
* tree.c (cp_save_expr): Don't call save_expr for TARGET_EXPRs.
* g++.dg/ext/cond3.C: New test.
From-SVN: r262254
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/tree.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/cond3.C | 20 |
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 906f0b4..556b154 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-06-29 Marek Polacek <polacek@redhat.com> + + PR c++/86184 + * tree.c (cp_save_expr): Don't call save_expr for TARGET_EXPRs. + 2018-06-28 David Malcolm <dmalcolm@redhat.com> * parser.c (cp_parser_error_1): After issuing a conflict marker diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index e7bd79b..361248d 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -4918,6 +4918,11 @@ cp_save_expr (tree expr) tree codes. */ if (processing_template_decl) return expr; + + /* TARGET_EXPRs are only expanded once. */ + if (TREE_CODE (expr) == TARGET_EXPR) + return expr; + return save_expr (expr); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9072c6d..cc71d59 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-06-29 Marek Polacek <polacek@redhat.com> + + PR c++/86184 + * g++.dg/ext/cond3.C: New test. + 2018-06-29 Kyrylo Tkachov <kyrylo.tkachov@arm.com> * gcc.target/arm/arm-soft-strd-even.c: New test. diff --git a/gcc/testsuite/g++.dg/ext/cond3.C b/gcc/testsuite/g++.dg/ext/cond3.C new file mode 100644 index 0000000..6390dc4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cond3.C @@ -0,0 +1,20 @@ +// PR c++/86184 +// { dg-do run } +// { dg-options "" } + +int j; +struct X { + X() { j++; } + operator bool() { return true; } +}; + +/* Only create X once. */ +bool b = X() ?: false; +bool b2 = X() ? X() : false; + +int +main () +{ + if (j != 3) + __builtin_abort (); +} |