aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/decl.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2009-05-18 17:48:02 -0400
committerJason Merrill <jason@gcc.gnu.org>2009-05-18 17:48:02 -0400
commite57d93c6bcfd50cdb3d1928d78e8fe0bb6ce517c (patch)
tree1cb5674ddf2e19bccf1158ba381c45a6b1606ef6 /gcc/cp/decl.c
parent82725547db6fba598916a16b027e06d16c5e6a57 (diff)
downloadgcc-e57d93c6bcfd50cdb3d1928d78e8fe0bb6ce517c.zip
gcc-e57d93c6bcfd50cdb3d1928d78e8fe0bb6ce517c.tar.gz
gcc-e57d93c6bcfd50cdb3d1928d78e8fe0bb6ce517c.tar.bz2
Implement explicit conversions ops as specified in N2437.
* decl.c (grokdeclarator): Handle explicit conversion ops. (check_initializer): Pass flags to store_init_value. * decl2.c (maybe_emit_vtables): Likewise. * init.c (expand_aggr_init_1): Likewise. * call.c (convert_class_to_reference): Take flags parm, check DECL_NONCONVERTING_P. (build_user_type_conversion_1): Check DECL_NONCONVERTING_P. (add_builtin_candidates): Simplify getting type of conversion. (build_object_call): Likewise. Check DECL_NONCONVERTING_P. (implicit_conversion): Pass through LOOKUP_ONLYCONVERTING. (reference_binding): Take flags parm. Direct-initialize copy parm. (add_function_candidate): Direct-initialize the copy parm. (add_conv_candidate): Use LOOKUP_IMPLICIT, not LOOKUP_NORMAL. (build_builtin_candidate): Add LOOKUP_ONLYCONVERTING. (conditional_conversion): Likewise. (convert_like_real): Only complain about DECL_NONCONVERTING_P constructors. (perform_implicit_conversion_flags): Add flags parm to perform_implicit_conversion. Improve diagnostics. * cp-tree.h (LOOKUP_IMPLICIT): New macro. (LOOKUP_COPY_PARM): New bit macro. * cvt.c (build_expr_type_conversion): Check DECL_NONCONVERTING_P. * typeck.c (convert_for_assignment): Take flags parm, pass it to perform_implicit_conversion_flags. (cp_build_modify_expr): Pass flags to convert_for_assignment. (convert_for_initialization): Likewise. * typeck2.c (store_init_value): Take flags parm, pass to digest_init_flags. (digest_init_flags): Add flags parm to digest_init. (digest_init_r): Take flags parm, pass to convert_for_initialization. (process_init_constructor_array): Pass it. (process_init_constructor_record): Likewise. (process_init_constructor_union): Likewise. From-SVN: r147677
Diffstat (limited to 'gcc/cp/decl.c')
-rw-r--r--gcc/cp/decl.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index ed76dc3..e9ff87b 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -5176,7 +5176,7 @@ check_initializer (tree decl, tree init, int flags, tree *cleanup)
return build_aggr_init_full_exprs (decl, init, flags);
else if (TREE_CODE (init) != TREE_VEC)
{
- init_code = store_init_value (decl, init);
+ init_code = store_init_value (decl, init, flags);
if (pedantic && TREE_CODE (type) == ARRAY_TYPE
&& DECL_INITIAL (decl)
&& TREE_CODE (DECL_INITIAL (decl)) == STRING_CST
@@ -8413,6 +8413,14 @@ grokdeclarator (const cp_declarator *declarator,
"class definition",
name);
}
+ else if (ctype && sfk == sfk_conversion)
+ {
+ if (explicitp == 1)
+ {
+ maybe_warn_cpp0x ("explicit conversion operators");
+ explicitp = 2;
+ }
+ }
arg_types = grokparms (declarator->u.function.parameters,
&parms);