aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-04-04 21:55:56 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-04-04 21:55:56 +0200
commit2ff7172ad6faa734cf7d55a06bffe6a0438626f0 (patch)
treeef0944e597f17c044b6d2f0805d36c25dc9412bb /gcc
parent628a15343e494e457c647347e879c69a62016e0c (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/constexpr.c10
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/ext/atomic-4.C9
-rw-r--r--gcc/testsuite/g++.dg/ext/builtin13.C9
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; }));
+}