From fb6a8b230ad98ab3c42efc2968483ceb5ef62886 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 24 Feb 2020 15:23:23 +0100 Subject: [PATCH] c++: P1937R2 - Fixing inconsistencies between const{expr,eval} functions 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 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 | 6 ++++++ gcc/cp/call.c | 2 ++ gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/cpp2a/consteval3.C | 6 +++--- gcc/testsuite/g++.dg/cpp2a/consteval6.C | 6 +++--- gcc/testsuite/g++.dg/ext/consteval1.C | 4 ++-- 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cc0f42d..831c717 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-02-24 Jakub Jelinek + + 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 P0780R2: Resolve lambda init-capture pack grammar. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index f47f96b..ed5338a 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5a6f34d..d92e40e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-02-24 Jakub Jelinek + + 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 PR lto/78353 diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval3.C b/gcc/testsuite/g++.dg/cpp2a/consteval3.C index 4214092..edd3a73 100644 --- a/gcc/testsuite/g++.dg/cpp2a/consteval3.C +++ b/gcc/testsuite/g++.dg/cpp2a/consteval3.C @@ -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)); } diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval6.C b/gcc/testsuite/g++.dg/cpp2a/consteval6.C index 72d5f79..cddb73d 100644 --- a/gcc/testsuite/g++.dg/cpp2a/consteval6.C +++ b/gcc/testsuite/g++.dg/cpp2a/consteval6.C @@ -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 @@ -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 ()); -using C = decltype (bar ()); // { dg-message "required from here" } +using C = decltype (bar ()); // { dg-bogus "required from here" } diff --git a/gcc/testsuite/g++.dg/ext/consteval1.C b/gcc/testsuite/g++.dg/ext/consteval1.C index 928e0f8..cf6f088 100644 --- a/gcc/testsuite/g++.dg/ext/consteval1.C +++ b/gcc/testsuite/g++.dg/ext/consteval1.C @@ -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" } -- 2.7.4