c++: P1937R2 - Fixing inconsistencies between const{expr,eval} functions
authorJakub Jelinek <jakub@redhat.com>
Mon, 24 Feb 2020 14:23:23 +0000 (15:23 +0100)
committerJakub Jelinek <jakub@redhat.com>
Mon, 24 Feb 2020 14:24:33 +0000 (15:24 +0100)
The following patch implements my understanding of P1937R2, though I wonder
if https://eel.is/c++draft/expr.const#14.example-1 shouldn't have been
also either removed or adjusted by the P1937R2 paper.

2020-02-24  Jakub Jelinek  <jakub@redhat.com>

P1937R2 - Fixing inconsistencies between const{expr,eval} functions
* call.c (build_over_call): Don't evaluate immediate functions in
unevaluated operands.

* g++.dg/ext/consteval1.C: Change dg-{message,error} into dg-bogus.
* g++.dg/cpp2a/consteval6.C: Likewise.
* g++.dg/cpp2a/consteval3.C: Change dg-error for unevaluated operands
into dg-bogus.

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp2a/consteval3.C
gcc/testsuite/g++.dg/cpp2a/consteval6.C
gcc/testsuite/g++.dg/ext/consteval1.C

index cc0f42dfda5b97e2c1fc5fbf0c1a5a37fc00e8a4..831c7177d6e18c91338f00744b8554c0ced4b506 100644 (file)
@@ -1,3 +1,9 @@
+2020-02-24  Jakub Jelinek  <jakub@redhat.com>
+
+       P1937R2 - Fixing inconsistencies between const{expr,eval} functions
+       * call.c (build_over_call): Don't evaluate immediate functions in
+       unevaluated operands.
+
 2020-02-24  Jason Merrill  <jason@redhat.com>
 
        P0780R2: Resolve lambda init-capture pack grammar.
index f47f96bf1c2f05f800b2b399a95ff62eecc6b819..ed5338adec904868e1fe41d8edfe3a036ae1f15c 100644 (file)
@@ -8425,6 +8425,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
        current_function_returns_abnormally = 1;
       if (TREE_CODE (fn) == FUNCTION_DECL
          && DECL_IMMEDIATE_FUNCTION_P (fn)
+         && cp_unevaluated_operand == 0
          && (current_function_decl == NULL_TREE
              || !DECL_IMMEDIATE_FUNCTION_P (current_function_decl))
          && (current_binding_level->kind != sk_function_parms
@@ -9061,6 +9062,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
       tree fndecl = STRIP_TEMPLATE (TREE_OPERAND (fn, 0));
       if (TREE_CODE (fndecl) == FUNCTION_DECL
          && DECL_IMMEDIATE_FUNCTION_P (fndecl)
+         && cp_unevaluated_operand == 0
          && (current_function_decl == NULL_TREE
              || !DECL_IMMEDIATE_FUNCTION_P (current_function_decl))
          && (current_binding_level->kind != sk_function_parms
index 5a6f34d918e8ad5bdc9f468296a4362cbce63a46..d92e40ec279b07cf6804868c4d935ee53d79e803 100644 (file)
@@ -1,3 +1,11 @@
+2020-02-24  Jakub Jelinek  <jakub@redhat.com>
+
+       P1937R2 - Fixing inconsistencies between const{expr,eval} functions
+       * g++.dg/ext/consteval1.C: Change dg-{message,error} into dg-bogus.
+       * g++.dg/cpp2a/consteval6.C: Likewise.
+       * g++.dg/cpp2a/consteval3.C: Change dg-error for unevaluated operands
+       into dg-bogus.
+
 2020-02-24  Christophe Lyon  <christophe.lyon@linaro.org>
 
        PR lto/78353
index 4214092131fd470fa13320c0e6faae62836f4586..edd3a7310b2ffd628ad8d8431ce4488f43eed712 100644 (file)
@@ -33,9 +33,9 @@ struct V { consteval int v = 5; };    // { dg-error "non-static data member 'v' dec
 struct W { consteval static int w; };  // { dg-error "static data member 'w' declared 'consteval'" }
 int i = sizeof (&f6);                  // { dg-error "taking address of an immediate function 'consteval int f6\\(int\\)'" }
 using j = decltype (&f6);              // { dg-error "taking address of an immediate function 'consteval int f6\\(int\\)'" }
-int k = sizeof (f6 (d));               // { dg-error "the value of 'd' is not usable in a constant expression" }
-using l = decltype (f6 (d));           // { dg-error "the value of 'd' is not usable in a constant expression" }
-bool m = noexcept (f6 (d));            // { dg-error "the value of 'd' is not usable in a constant expression" }
+int k = sizeof (f6 (d));               // { dg-bogus "the value of 'd' is not usable in a constant expression" }
+using l = decltype (f6 (d));           // { dg-bogus "the value of 'd' is not usable in a constant expression" }
+bool m = noexcept (f6 (d));            // { dg-bogus "the value of 'd' is not usable in a constant expression" }
 namespace std {
 using size_t = decltype (sizeof (0));
 }
index 72d5f79762e64b33202619d7e3bdebc8d2c19c39..cddb73dfaa2e589d03304b2e5a0bb6287e8c431b 100644 (file)
@@ -3,7 +3,7 @@
 
 struct A {
   constexpr A () {}
-  A (A const&) = delete;       // { dg-message "declared here" }
+  A (A const&) = delete;       // { dg-bogus "declared here" }
 };
 
 template<typename T>
@@ -19,8 +19,8 @@ consteval void
 bar ()
 {
   T t;
-  T u = t;     // { dg-error "use of deleted function" }
+  T u = t;     // { dg-bogus "use of deleted function" }
 }
 
 using B = decltype (foo<A> ());
-using C = decltype (bar<A> ());        // { dg-message "required from here" }
+using C = decltype (bar<A> ());        // { dg-bogus "required from here" }
index 928e0f8ab174cf4f1b15f0c7e7b08f4b0cb1bc58..cf6f088a00f527b5bb069798c41df1795eb9b4ec 100644 (file)
@@ -2,5 +2,5 @@
 // { dg-options "-std=c++2a" }
 
 consteval int foo (int x) { return x; }
-int d = 6;                     // { dg-message "'int d' is not const" }
-bool e = __builtin_has_attribute (foo (d), packed);    // { dg-error "the value of 'd' is not usable in a constant expression" }
+int d = 6;                     // { dg-bogus "'int d' is not const" }
+bool e = __builtin_has_attribute (foo (d), packed);    // { dg-bogus "the value of 'd' is not usable in a constant expression" }