]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: diagnosing if-stmt with non-constant branches [PR105050]
authorPatrick Palka <ppalka@redhat.com>
Sat, 26 Mar 2022 14:20:18 +0000 (10:20 -0400)
committerPatrick Palka <ppalka@redhat.com>
Sat, 26 Mar 2022 14:20:18 +0000 (10:20 -0400)
When an if-stmt is determined to be non-constant because both of its
branches are non-constant, we issue a somewhat generic error which,
since the error also points to the 'if' token, misleadingly suggests
the condition is at fault:

  constexpr-105050.C:8:3: error: expression â€˜<statement>’ is not a constant expression
      8 |   if (p != q && *p < 0)
        |   ^~

This patch clarifies the error message to instead read:

  constexpr-105050.C:8:3: error: neither branch of â€˜if’ is a constant expression
      8 |   if (p != q && *p < 0)
        |   ^~

PR c++/105050

gcc/cp/ChangeLog:

* constexpr.cc (potential_constant_expression_1) <case IF_STMT>:
Clarify error message when a if-stmt is non-constant because its
branches are non-constant.

gcc/testsuite/ChangeLog:

* g++.dg/cpp1y/constexpr-105050.C: New test.

gcc/cp/constexpr.cc
gcc/testsuite/g++.dg/cpp1y/constexpr-105050.C [new file with mode: 0644]

index 778680b82701ce160d6c40c40ad1bcb0101c4160..9c40b0515747d84db01a28f92797ed052d026cbc 100644 (file)
@@ -9439,7 +9439,12 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
            }
        }
       if (flags & tf_error)
-       error_at (loc, "expression %qE is not a constant expression", t);
+       {
+         if (TREE_CODE (t) == IF_STMT)
+           error_at (loc, "neither branch of %<if%> is a constant expression");
+         else
+           error_at (loc, "expression %qE is not a constant expression", t);
+       }
       return false;
 
     case VEC_INIT_EXPR:
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-105050.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-105050.C
new file mode 100644 (file)
index 0000000..e0688fb
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/105050
+// { dg-do compile { target c++14 } }
+
+void g();
+void h();
+
+constexpr void f(int* p, int* q) {
+  if (p != q && *p < 0) // { dg-error "neither branch of 'if' is a constant expression" }
+    g();
+  else
+    h();
+}