Commit c91b2715 by Marek Polacek Committed by Marek Polacek

PR c++/89836 - bool constant expression and explicit conversions.

	* call.c (build_converted_constant_expr_internal): New function,
	renamed from...
	(build_converted_constant_expr): ...this.  New.
	(build_converted_constant_bool_expr): New.
	* cp-tree.h (build_converted_constant_bool_expr): Declare.
	* decl.c (build_explicit_specifier): Call
	build_converted_constant_bool_expr.

	* g++.dg/cpp2a/explicit15.C: New test.

From-SVN: r270002
parent bb15c8b7
2019-03-28 Marek Polacek <polacek@redhat.com>
PR c++/89836 - bool constant expression and explicit conversions.
* call.c (build_converted_constant_expr_internal): New function,
renamed from...
(build_converted_constant_expr): ...this. New.
(build_converted_constant_bool_expr): New.
* cp-tree.h (build_converted_constant_bool_expr): Declare.
* decl.c (build_explicit_specifier): Call
build_converted_constant_bool_expr.
2019-03-28 Jakub Jelinek <jakub@redhat.com> 2019-03-28 Jakub Jelinek <jakub@redhat.com>
PR c++/89785 PR c++/89785
......
...@@ -4175,18 +4175,11 @@ build_user_type_conversion (tree totype, tree expr, int flags, ...@@ -4175,18 +4175,11 @@ build_user_type_conversion (tree totype, tree expr, int flags,
return ret; return ret;
} }
/* Subroutine of convert_nontype_argument. /* Worker for build_converted_constant_expr. */
EXPR is an expression used in a context that requires a converted
constant-expression, such as a template non-type parameter. Do any
necessary conversions (that are permitted for converted
constant-expressions) to convert it to the desired type.
If conversion is successful, returns the converted expression;
otherwise, returns error_mark_node. */
tree static tree
build_converted_constant_expr (tree type, tree expr, tsubst_flags_t complain) build_converted_constant_expr_internal (tree type, tree expr,
int flags, tsubst_flags_t complain)
{ {
conversion *conv; conversion *conv;
void *p; void *p;
...@@ -4200,8 +4193,7 @@ build_converted_constant_expr (tree type, tree expr, tsubst_flags_t complain) ...@@ -4200,8 +4193,7 @@ build_converted_constant_expr (tree type, tree expr, tsubst_flags_t complain)
p = conversion_obstack_alloc (0); p = conversion_obstack_alloc (0);
conv = implicit_conversion (type, TREE_TYPE (expr), expr, conv = implicit_conversion (type, TREE_TYPE (expr), expr,
/*c_cast_p=*/false, /*c_cast_p=*/false, flags, complain);
LOOKUP_IMPLICIT, complain);
/* A converted constant expression of type T is an expression, implicitly /* A converted constant expression of type T is an expression, implicitly
converted to type T, where the converted expression is a constant converted to type T, where the converted expression is a constant
...@@ -4304,6 +4296,38 @@ build_converted_constant_expr (tree type, tree expr, tsubst_flags_t complain) ...@@ -4304,6 +4296,38 @@ build_converted_constant_expr (tree type, tree expr, tsubst_flags_t complain)
return expr; return expr;
} }
/* Subroutine of convert_nontype_argument.
EXPR is an expression used in a context that requires a converted
constant-expression, such as a template non-type parameter. Do any
necessary conversions (that are permitted for converted
constant-expressions) to convert it to the desired type.
This function doesn't consider explicit conversion functions. If
you mean to use "a contextually converted constant expression of type
bool", use build_converted_constant_bool_expr.
If conversion is successful, returns the converted expression;
otherwise, returns error_mark_node. */
tree
build_converted_constant_expr (tree type, tree expr, tsubst_flags_t complain)
{
return build_converted_constant_expr_internal (type, expr, LOOKUP_IMPLICIT,
complain);
}
/* Used to create "a contextually converted constant expression of type
bool". This differs from build_converted_constant_expr in that it
also considers explicit conversion functions. */
tree
build_converted_constant_bool_expr (tree expr, tsubst_flags_t complain)
{
return build_converted_constant_expr_internal (boolean_type_node, expr,
LOOKUP_NORMAL, complain);
}
/* Do any initial processing on the arguments to a function call. */ /* Do any initial processing on the arguments to a function call. */
static vec<tree, va_gc> * static vec<tree, va_gc> *
......
...@@ -6233,6 +6233,7 @@ extern int remaining_arguments (tree); ...@@ -6233,6 +6233,7 @@ extern int remaining_arguments (tree);
extern tree perform_implicit_conversion (tree, tree, tsubst_flags_t); extern tree perform_implicit_conversion (tree, tree, tsubst_flags_t);
extern tree perform_implicit_conversion_flags (tree, tree, tsubst_flags_t, int); extern tree perform_implicit_conversion_flags (tree, tree, tsubst_flags_t, int);
extern tree build_converted_constant_expr (tree, tree, tsubst_flags_t); extern tree build_converted_constant_expr (tree, tree, tsubst_flags_t);
extern tree build_converted_constant_bool_expr (tree, tsubst_flags_t);
extern tree perform_direct_initialization_if_possible (tree, tree, bool, extern tree perform_direct_initialization_if_possible (tree, tree, bool,
tsubst_flags_t); tsubst_flags_t);
extern tree in_charge_arg_for_name (tree); extern tree in_charge_arg_for_name (tree);
......
...@@ -16700,7 +16700,7 @@ build_explicit_specifier (tree expr, tsubst_flags_t complain) ...@@ -16700,7 +16700,7 @@ build_explicit_specifier (tree expr, tsubst_flags_t complain)
expr = instantiate_non_dependent_expr_sfinae (expr, complain); expr = instantiate_non_dependent_expr_sfinae (expr, complain);
/* Don't let convert_like_real create more template codes. */ /* Don't let convert_like_real create more template codes. */
processing_template_decl_sentinel s; processing_template_decl_sentinel s;
expr = build_converted_constant_expr (boolean_type_node, expr, complain); expr = build_converted_constant_bool_expr (expr, complain);
expr = cxx_constant_value (expr); expr = cxx_constant_value (expr);
return expr; return expr;
} }
......
2019-03-28 Marek Polacek <polacek@redhat.com>
PR c++/89836 - bool constant expression and explicit conversions.
* g++.dg/cpp2a/explicit15.C: New test.
2019-03-28 Jakub Jelinek <jakub@redhat.com> 2019-03-28 Jakub Jelinek <jakub@redhat.com>
PR c/89812 PR c/89812
......
// PR c++/89836
// { dg-do compile { target c++2a } }
struct W {
constexpr explicit operator bool() { return true; };
};
struct U {
explicit(W()) U(int);
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment