aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/consteval3.C6
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/consteval6.C6
-rw-r--r--gcc/testsuite/g++.dg/ext/consteval1.C4
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 <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.
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 <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
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<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" }
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" }