diff mbox

[C++,Patch/RFC] PR 67980 ("left shift count is negative [-Wshift-count-negative] generated for unreachable code")

Message ID 40a04c1f-6c98-c3e1-57ac-c672b93e2f49@oracle.com
State New
Headers show

Commit Message

Paolo Carlini Oct. 18, 2016, 8:26 p.m. UTC
... sorry, what I sent earlier in fact causes a regression in the 
libstdc++-v3 testsuite: 23_containers/list/61347.cc.

Thus, I'm back to one of my first tries earlier today: a much more 
conservative change which uses fold_non_dependent_expr only for the 
purpose of suppressing the unwanted warnings, see the below.

Thanks,
Paolo.

///////////////////

Comments

Paolo Carlini Nov. 3, 2016, 1 a.m. UTC | #1
.. I'm still looking for some directions about the best way to handle 
this issue: anyway, in case it wasn't clear, the second patch I posted 
passes testing.

Thanks,
Paolo.
Jason Merrill Nov. 3, 2016, 1:25 p.m. UTC | #2
On Tue, Oct 18, 2016 at 4:26 PM, Paolo Carlini <paolo.carlini@oracle.com> wrote:
> Thus, I'm back to one of my first tries earlier today: a much more
> conservative change which uses fold_non_dependent_expr only for the purpose
> of suppressing the unwanted warnings, see the below.

This looks right; in general we use early folding only to control warnings.  OK.

Jason
diff mbox

Patch

Index: cp/pt.c
===================================================================
--- cp/pt.c	(revision 241313)
+++ cp/pt.c	(working copy)
@@ -15410,7 +15410,14 @@ 
       if (IF_STMT_CONSTEXPR_P (t) && integer_zerop (tmp))
 	/* Don't instantiate the THEN_CLAUSE. */;
       else
-	RECUR (THEN_CLAUSE (t));
+	{
+	  bool inhibit = integer_zerop (fold_non_dependent_expr (tmp));
+	  if (inhibit)
+	    ++c_inhibit_evaluation_warnings;
+	  RECUR (THEN_CLAUSE (t));
+	  if (inhibit)
+	    --c_inhibit_evaluation_warnings;
+	}
       finish_then_clause (stmt);
 
       if (IF_STMT_CONSTEXPR_P (t) && integer_nonzerop (tmp))
@@ -15417,8 +15424,13 @@ 
 	/* Don't instantiate the ELSE_CLAUSE. */;
       else if (ELSE_CLAUSE (t))
 	{
+	  bool inhibit = integer_nonzerop (fold_non_dependent_expr (tmp));
 	  begin_else_clause (stmt);
+	  if (inhibit)
+	    ++c_inhibit_evaluation_warnings;
 	  RECUR (ELSE_CLAUSE (t));
+	  if (inhibit)
+	    --c_inhibit_evaluation_warnings;
 	  finish_else_clause (stmt);
 	}
 
Index: testsuite/g++.dg/cpp1y/pr67980.C
===================================================================
--- testsuite/g++.dg/cpp1y/pr67980.C	(revision 0)
+++ testsuite/g++.dg/cpp1y/pr67980.C	(working copy)
@@ -0,0 +1,23 @@ 
+// { dg-do compile { target c++14 } }
+
+template <int Y, class T>
+constexpr T cpp14_constexpr_then(T value) {
+  if (Y < 0)
+    return (value << -Y);
+  else
+    return 0;
+}
+
+template <int Y, class T>
+constexpr T cpp14_constexpr_else(T value) {
+  if (Y > 0)
+    return 0;
+  else
+    return (value << -Y);
+}
+
+int main()
+{
+  cpp14_constexpr_then<1>(0);
+  cpp14_constexpr_else<1>(0);
+}