diff mbox series

c++: P1937R2 - Fixing inconsistencies between const{expr,eval} functions

Message ID 20200224140612.GF2155@tucnak
State New
Headers show
Series c++: P1937R2 - Fixing inconsistencies between const{expr,eval} functions | expand

Commit Message

Jakub Jelinek Feb. 24, 2020, 2:06 p.m. UTC
Hi!

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.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

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.


	Jakub

Comments

Jason Merrill Feb. 24, 2020, 2:12 p.m. UTC | #1
On 2/24/20 9:06 AM, Jakub Jelinek wrote:
> Hi!
> 
> 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.

Ah, good catch.

> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

> 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/call.c.jj	2020-02-08 10:58:28.439866081 +0100
> +++ gcc/cp/call.c	2020-02-15 22:18:20.311789273 +0100
> @@ -8424,6 +8424,7 @@ build_over_call (struct z_candidate *can
>   	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
> @@ -9060,6 +9061,7 @@ build_over_call (struct z_candidate *can
>         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
> --- gcc/testsuite/g++.dg/ext/consteval1.C.jj	2020-01-12 11:54:37.166402048 +0100
> +++ gcc/testsuite/g++.dg/ext/consteval1.C	2020-02-15 22:33:12.690505111 +0100
> @@ -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" }
> --- gcc/testsuite/g++.dg/cpp2a/consteval3.C.jj	2020-01-12 11:54:37.140402440 +0100
> +++ gcc/testsuite/g++.dg/cpp2a/consteval3.C	2020-02-15 22:22:50.618765423 +0100
> @@ -33,9 +33,9 @@ struct V { consteval int v = 5; };	// {
>   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));
>   }
> --- gcc/testsuite/g++.dg/cpp2a/consteval6.C.jj	2020-01-12 11:54:37.140402440 +0100
> +++ gcc/testsuite/g++.dg/cpp2a/consteval6.C	2020-02-15 22:32:11.140421368 +0100
> @@ -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" }
> 
> 	Jakub
>
diff mbox series

Patch

--- gcc/cp/call.c.jj	2020-02-08 10:58:28.439866081 +0100
+++ gcc/cp/call.c	2020-02-15 22:18:20.311789273 +0100
@@ -8424,6 +8424,7 @@  build_over_call (struct z_candidate *can
 	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
@@ -9060,6 +9061,7 @@  build_over_call (struct z_candidate *can
       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
--- gcc/testsuite/g++.dg/ext/consteval1.C.jj	2020-01-12 11:54:37.166402048 +0100
+++ gcc/testsuite/g++.dg/ext/consteval1.C	2020-02-15 22:33:12.690505111 +0100
@@ -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" }
--- gcc/testsuite/g++.dg/cpp2a/consteval3.C.jj	2020-01-12 11:54:37.140402440 +0100
+++ gcc/testsuite/g++.dg/cpp2a/consteval3.C	2020-02-15 22:22:50.618765423 +0100
@@ -33,9 +33,9 @@  struct V { consteval int v = 5; };	// {
 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));
 }
--- gcc/testsuite/g++.dg/cpp2a/consteval6.C.jj	2020-01-12 11:54:37.140402440 +0100
+++ gcc/testsuite/g++.dg/cpp2a/consteval6.C	2020-02-15 22:32:11.140421368 +0100
@@ -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" }