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