Message ID | 20200917163615.1800494-1-ppalka@redhat.com |
---|---|
State | New |
Headers | show |
Series | c++: std::is_constant_evaluated inside a constraint [PR97051] | expand |
On 9/17/20 12:36 PM, Patrick Palka wrote: > According to [expr.const]/14, the result of substitution into an atomic > constraint is manifestly constant-evaluated; this patch adjusts the call > to maybe_constant_value in satisfy_atom to that effect. > > Tested on x86_64-pc-linux-gnu, and also tested on the cmcstl2 and > range-v3 libraries. Does this look OK to commit? OK. > gcc/cp/ChangeLog: > > PR c++/97051 > * constraint.cc (satisfy_atom): Pass true as the > manifestly_const_eval argument to maybe_constant_value. > > gcc/testsuite/ChangeLog: > > PR c++/97051 > * g++.dg/cpp2a/is-constant-evaluated11.C: New test. > --- > gcc/cp/constraint.cc | 3 ++- > .../g++.dg/cpp2a/is-constant-evaluated11.C | 16 ++++++++++++++++ > 2 files changed, 18 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated11.C > > diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc > index 0aab3073cc1..8137df59e37 100644 > --- a/gcc/cp/constraint.cc > +++ b/gcc/cp/constraint.cc > @@ -2643,7 +2643,8 @@ satisfy_atom (tree t, tree args, subst_info info) > result = cxx_constant_value (result); > else > { > - result = maybe_constant_value (result); > + result = maybe_constant_value (result, NULL_TREE, > + /*manifestly_const_eval=*/true); > if (!TREE_CONSTANT (result)) > result = error_mark_node; > } > diff --git a/gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated11.C b/gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated11.C > new file mode 100644 > index 00000000000..a31867f74fb > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated11.C > @@ -0,0 +1,16 @@ > +// PR c++/97051 > +// { dg-do compile { target c++20 } } > + > +namespace std { > + constexpr inline bool > + is_constant_evaluated () noexcept > + { > + return __builtin_is_constant_evaluated (); > + } > +} > + > +template<typename> > + requires (std::is_constant_evaluated()) > +constexpr int a = 0; > + > +constexpr int b = a<int>; >
diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index 0aab3073cc1..8137df59e37 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -2643,7 +2643,8 @@ satisfy_atom (tree t, tree args, subst_info info) result = cxx_constant_value (result); else { - result = maybe_constant_value (result); + result = maybe_constant_value (result, NULL_TREE, + /*manifestly_const_eval=*/true); if (!TREE_CONSTANT (result)) result = error_mark_node; } diff --git a/gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated11.C b/gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated11.C new file mode 100644 index 00000000000..a31867f74fb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated11.C @@ -0,0 +1,16 @@ +// PR c++/97051 +// { dg-do compile { target c++20 } } + +namespace std { + constexpr inline bool + is_constant_evaluated () noexcept + { + return __builtin_is_constant_evaluated (); + } +} + +template<typename> + requires (std::is_constant_evaluated()) +constexpr int a = 0; + +constexpr int b = a<int>;