From: Jakub Jelinek Date: Fri, 22 Jun 2018 21:05:52 +0000 (+0200) Subject: backport: re PR inline-asm/85172 (internal compiler error: unexpected expression... X-Git-Tag: releases/gcc-7.4.0~342 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de680082bef8bb3188b2dec625200833fa60a958;p=thirdparty%2Fgcc.git backport: re PR inline-asm/85172 (internal compiler error: unexpected expression '' of kind asm_expr) Backported from mainline 2018-04-04 Jakub Jelinek 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: r261947 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 062384e41156..a3bec6f43140 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,14 @@ 2018-06-22 Jakub Jelinek Backported from mainline + 2018-04-04 Jakub Jelinek + + 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. + 2018-04-03 Jakub Jelinek PR c++/85147 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 96f8277bdf2e..361a955ba018 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -1158,8 +1158,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 ae3c9cb8681d..25011ca786d5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,12 @@ 2018-06-22 Jakub Jelinek Backported from mainline + 2018-04-04 Jakub Jelinek + + PR inline-asm/85172 + * g++.dg/ext/builtin13.C: New test. + * g++.dg/ext/atomic-4.C: New test. + 2018-04-03 Jakub Jelinek PR rtl-optimization/85167 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 000000000000..1eba11773e99 --- /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 000000000000..7007fe8a6ef6 --- /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; })); +}