re PR c++/88977 (__builtin_is_constant_evaluated() as function template argument causes substitution failure)

PR c++/88977
	* pt.c (convert_nontype_argument): Pass true as manifestly_const_eval
	to maybe_constant_value calls.

	* g++.dg/cpp2a/is-constant-evaluated7.C: New test.

From-SVN: r268780
This commit is contained in:
Jakub Jelinek 2019-02-11 21:00:16 +01:00 committed by Jakub Jelinek
parent f9fb2d275e
commit 75c5639de1
4 changed files with 33 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2019-02-11 Jakub Jelinek <jakub@redhat.com>
PR c++/88977
* pt.c (convert_nontype_argument): Pass true as manifestly_const_eval
to maybe_constant_value calls.
2019-02-11 Marek Polacek <polacek@redhat.com>
* typeck2.c (digest_init_r): Remove commented code.

View File

@ -6821,12 +6821,14 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
/* Make sure we return NULL_TREE only if we have really issued
an error, as described above. */
return (complain & tf_error) ? NULL_TREE : error_mark_node;
expr = maybe_constant_value (expr);
expr = maybe_constant_value (expr, NULL_TREE,
/*manifestly_const_eval=*/true);
expr = convert_from_reference (expr);
}
else if (TYPE_PTR_OR_PTRMEM_P (type))
{
tree folded = maybe_constant_value (expr);
tree folded = maybe_constant_value (expr, NULL_TREE,
/*manifestly_const_eval=*/true);
if (TYPE_PTR_P (type) ? integer_zerop (folded)
: null_member_pointer_value_p (folded))
expr = folded;

View File

@ -1,3 +1,8 @@
2019-02-11 Jakub Jelinek <jakub@redhat.com>
PR c++/88977
* g++.dg/cpp2a/is-constant-evaluated7.C: New test.
2019-02-12 Wilco Dijkstra <wdijkstr@arm.com>
PR tree-optimization/86637

View File

@ -0,0 +1,18 @@
// P0595R2
// PR c++/88977
// { dg-do compile { target c++11 } }
namespace std {
constexpr inline bool
is_constant_evaluated () noexcept
{
return __builtin_is_constant_evaluated ();
}
}
template<bool B> constexpr bool foo () { return B; }
constexpr bool x = foo<std::is_constant_evaluated ()> ();
constexpr bool y = foo<__builtin_is_constant_evaluated ()> ();
static_assert (x, "");
static_assert (y, "");