re PR c++/68847 (ICE in cxx_eval_constant_expression on __atomic_compare_exchange...
authorJason Merrill <jason@redhat.com>
Fri, 15 Jan 2016 15:57:17 +0000 (10:57 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 15 Jan 2016 15:57:17 +0000 (10:57 -0500)
PR c++/68847
* call.c (build_cxx_call): Use fold_non_dependent_expr.

From-SVN: r232438

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/g++.dg/delayedfold/builtin1.C [new file with mode: 0644]

index fc846dc..0ad384a 100644 (file)
@@ -1,5 +1,8 @@
 2016-01-15  Jason Merrill  <jason@redhat.com>
 
+       PR c++/68847
+       * call.c (build_cxx_call): Use fold_non_dependent_expr.
+
        * typeck2.c (cxx_incomplete_type_diagnostic): Use the location of
        value.
 
index c05170a..ce87be7 100644 (file)
@@ -7755,7 +7755,7 @@ build_cxx_call (tree fn, int nargs, tree *argarray,
       /* We need to take care that values to BUILT_IN_NORMAL
          are reduced.  */
       for (i = 0; i < nargs; i++)
-       argarray[i] = maybe_constant_value (argarray[i]);
+       argarray[i] = fold_non_dependent_expr (argarray[i]);
 
       if (!check_builtin_function_arguments (fndecl, nargs, argarray))
        return error_mark_node;
diff --git a/gcc/testsuite/g++.dg/delayedfold/builtin1.C b/gcc/testsuite/g++.dg/delayedfold/builtin1.C
new file mode 100644 (file)
index 0000000..32f4435
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/68847
+// { dg-do compile { target cas_int } }
+
+class RegionLock {
+  template <unsigned long> void m_fn1();
+  int spinlock;
+} acquire_zero;
+int acquire_one;
+template <unsigned long> void RegionLock::m_fn1() {
+  __atomic_compare_exchange(&spinlock, &acquire_zero, &acquire_one, false, 2, 2);
+}