diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-04-04 21:55:56 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-04-04 21:55:56 +0200 |
commit | 2ff7172ad6faa734cf7d55a06bffe6a0438626f0 (patch) | |
tree | ef0944e597f17c044b6d2f0805d36c25dc9412bb /gcc | |
parent | 628a15343e494e457c647347e879c69a62016e0c (diff) | |
download | gcc-2ff7172ad6faa734cf7d55a06bffe6a0438626f0.zip gcc-2ff7172ad6faa734cf7d55a06bffe6a0438626f0.tar.gz gcc-2ff7172ad6faa734cf7d55a06bffe6a0438626f0.tar.bz2 |
re PR inline-asm/85172 (internal compiler error: unexpected expression '<statement>' of kind asm_expr)
PR inline-asm/85172
* constexpr.c (cxx_eval_builtin_function_call): For calls to
builtin_valid_in_constant_expr_p functions, don't call
cxx_eval_constant_expression if argument is not
potential_constant_expression.
* g++.dg/ext/builtin13.C: New test.
* g++.dg/ext/atomic-4.C: New test.
From-SVN: r259104
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/atomic-4.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/builtin13.C | 9 |
5 files changed, 36 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 71bde98..a691763 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2018-04-04 Jakub Jelinek <jakub@redhat.com> + PR inline-asm/85172 + * constexpr.c (cxx_eval_builtin_function_call): For calls to + builtin_valid_in_constant_expr_p functions, don't call + cxx_eval_constant_expression if argument is not + potential_constant_expression. + PR c++/85146 * cp-tree.h (calculate_bases, calculate_direct_bases): Add complain argument. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 201f27d..3cc196b 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -1189,8 +1189,14 @@ cxx_eval_builtin_function_call (const constexpr_ctx *ctx, tree t, tree fun, bool dummy1 = false, dummy2 = false; for (i = 0; i < nargs; ++i) { - args[i] = cxx_eval_constant_expression (&new_ctx, CALL_EXPR_ARG (t, i), - false, &dummy1, &dummy2); + args[i] = CALL_EXPR_ARG (t, i); + /* If builtin_valid_in_constant_expr_p is true, + potential_constant_expression_1 has not recursed into the arguments + of the builtin, verify it here. */ + if (!builtin_valid_in_constant_expr_p (fun) + || potential_constant_expression (args[i])) + args[i] = cxx_eval_constant_expression (&new_ctx, args[i], false, + &dummy1, &dummy2); if (bi_const_p) /* For __built_in_constant_p, fold all expressions with constant values even if they aren't C++ constant-expressions. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7806777..fe56c9d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2018-04-04 Jakub Jelinek <jakub@redhat.com> + PR inline-asm/85172 + * g++.dg/ext/builtin13.C: New test. + * g++.dg/ext/atomic-4.C: New test. + PR c++/85146 * g++.dg/ext/bases2.C: Expect extra error diagnostics. * g++.dg/ext/bases3.C: New test. diff --git a/gcc/testsuite/g++.dg/ext/atomic-4.C b/gcc/testsuite/g++.dg/ext/atomic-4.C new file mode 100644 index 0000000..1eba117 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/atomic-4.C @@ -0,0 +1,9 @@ +// PR inline-asm/85172 +// { dg-do compile } +// { dg-options "" } + +int +foo (int *p) +{ + return !__atomic_always_lock_free (4, ({ __asm (""); p; })); +} diff --git a/gcc/testsuite/g++.dg/ext/builtin13.C b/gcc/testsuite/g++.dg/ext/builtin13.C new file mode 100644 index 0000000..7007fe8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin13.C @@ -0,0 +1,9 @@ +// PR inline-asm/85172 +// { dg-do compile } +// { dg-options "" } + +int +foo () +{ + return !__builtin_constant_p (({ __asm (""); 0; })); +} |