re PR c++/56930 (pointless -Wconversion warning with sizeof)
authorJason Merrill <jason@redhat.com>
Thu, 23 May 2013 03:47:35 +0000 (23:47 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 23 May 2013 03:47:35 +0000 (23:47 -0400)
PR c++/56930
* call.c (convert_like_real): Use cp_convert_and_check.
* cvt.c (cp_convert_and_check): Use maybe_constant_value.
* semantics.c (cxx_eval_constant_expression): Handle LTGT_EXPR.
(potential_constant_expression_1): Handle OMP_ATOMIC*.

From-SVN: r199232

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/cvt.c
gcc/cp/semantics.c
gcc/testsuite/g++.dg/cpp0x/initlist71.C [new file with mode: 0644]

index cd58d70f4a010018698b66db3b720417394f5b5d..7025f34102466132bcdf906e530cba2c73e78b38 100644 (file)
@@ -1,5 +1,11 @@
 2013-05-22  Jason Merrill  <jason@redhat.com>
 
+       PR c++/56930
+       * call.c (convert_like_real): Use cp_convert_and_check.
+       * cvt.c (cp_convert_and_check): Use maybe_constant_value.
+       * semantics.c (cxx_eval_constant_expression): Handle LTGT_EXPR.
+       (potential_constant_expression_1): Handle OMP_ATOMIC*.
+
        PR c++/56915
        * semantics.c (maybe_add_lambda_conv_op): Give up if the call op
        isn't defined.
index 71a1589d64ab7bba36fa5feea1c9745e48166ea4..0b6a83f344549468468bf7e0ced6006b5205adc6 100644 (file)
@@ -6199,10 +6199,10 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
   if (convs->check_narrowing)
     check_narrowing (totype, expr);
 
-  if (issue_conversion_warnings && (complain & tf_warning))
-    expr = convert_and_check (totype, expr);
+  if (issue_conversion_warnings)
+    expr = cp_convert_and_check (totype, expr, complain);
   else
-    expr = convert (totype, expr);
+    expr = cp_convert (totype, expr, complain);
 
   return expr;
 }
index 93be76a6c05a67af98ffa1f2ec6056b586015e3e..d9e905e35040784b2019ebee09e9f3b65f9e8b5f 100644 (file)
@@ -624,10 +624,20 @@ cp_convert_and_check (tree type, tree expr, tsubst_flags_t complain)
   result = cp_convert (type, expr, complain);
 
   if ((complain & tf_warning)
-      && c_inhibit_evaluation_warnings == 0
-      && !TREE_OVERFLOW_P (expr)
-      && result != error_mark_node)
-    warnings_for_convert_and_check (type, expr, result);
+      && c_inhibit_evaluation_warnings == 0)
+    {
+      tree folded = maybe_constant_value (expr);
+      tree stripped = folded;
+      tree folded_result = cp_convert (type, folded, complain);
+
+      /* maybe_constant_value wraps an INTEGER_CST with TREE_OVERFLOW in a
+        NOP_EXPR so that it isn't TREE_CONSTANT anymore.  */
+      STRIP_NOPS (stripped);
+
+      if (!TREE_OVERFLOW_P (stripped)
+         && folded_result != error_mark_node)
+       warnings_for_convert_and_check (type, folded, folded_result);
+    }
 
   return result;
 }
index 5b363377b53045fcfa3066f64886179c10599a92..c115d23bcd9ef1aac87067f3caa5740401944341 100644 (file)
@@ -8045,6 +8045,7 @@ cxx_eval_constant_expression (const constexpr_call *call, tree t,
     case UNGT_EXPR:
     case UNGE_EXPR:
     case UNEQ_EXPR:
+    case LTGT_EXPR:
     case RANGE_EXPR:
     case COMPLEX_EXPR:
       r = cxx_eval_binary_expression (call, t, allow_non_constant, addr,
@@ -8620,6 +8621,10 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags)
     case THROW_EXPR:
     case MODIFY_EXPR:
     case MODOP_EXPR:
+    case OMP_ATOMIC:
+    case OMP_ATOMIC_READ:
+    case OMP_ATOMIC_CAPTURE_OLD:
+    case OMP_ATOMIC_CAPTURE_NEW:
       /* GCC internal stuff.  */
     case VA_ARG_EXPR:
     case OBJ_TYPE_REF:
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist71.C b/gcc/testsuite/g++.dg/cpp0x/initlist71.C
new file mode 100644 (file)
index 0000000..1d14390
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/56930
+// { dg-require-effective-target c++11 }
+// { dg-options -Wconversion }
+
+int main()
+{
+  int x = sizeof(int);
+  int y { sizeof(int) };
+}
+