re PR c++/48450 ([C++0x][SFINAE] Hard errors with static_cast expressions)
authorJason Merrill <jason@redhat.com>
Thu, 7 Apr 2011 21:47:24 +0000 (17:47 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 7 Apr 2011 21:47:24 +0000 (17:47 -0400)
PR c++/48450
* tree.c (build_cplus_new, build_aggr_init_expr): Take complain.
(bot_manip): Adjust.
* cp-tree.h: Adjust.
* call.c (convert_like_real, build_cxx_call): Adjust.
(perform_direct_initialization_if_possible): Adjust.
* cvt.c (ocp_convert): Adjust.
* init.c (build_value_init): Adjust.
* semantics.c (maybe_add_lambda_conv_op): Adjust.
* typeck.c (unary_complex_lvalue, cp_build_modify_expr): Adjust.
* typeck2.c (build_functional_cast): Adjust.

From-SVN: r172143

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/cp-tree.h
gcc/cp/cvt.c
gcc/cp/init.c
gcc/cp/semantics.c
gcc/cp/tree.c
gcc/cp/typeck.c
gcc/cp/typeck2.c

index ca7a79088c2afe27f0e5669d2d752b408174efcb..b8b87cf8e3d0d4773777ae0a7c470f6613eaf42b 100644 (file)
@@ -1,5 +1,17 @@
 2011-04-07  Jason Merrill  <jason@redhat.com>
 
+       PR c++/48450
+       * tree.c (build_cplus_new, build_aggr_init_expr): Take complain.
+       (bot_manip): Adjust.
+       * cp-tree.h: Adjust.
+       * call.c (convert_like_real, build_cxx_call): Adjust.
+       (perform_direct_initialization_if_possible): Adjust.
+       * cvt.c (ocp_convert): Adjust.
+       * init.c (build_value_init): Adjust.
+       * semantics.c (maybe_add_lambda_conv_op): Adjust.
+       * typeck.c (unary_complex_lvalue, cp_build_modify_expr): Adjust.
+       * typeck2.c (build_functional_cast): Adjust.
+
        * init.c (build_value_init_noctor): Handle REFERENCE_TYPE at top
        level.
        (perform_member_init): Not here.
index ad2de43c5e20920a5fcef37b85f32b80de3717a4..c2730271dcf2a87bf609e5cf007e88f3e1a977b3 100644 (file)
@@ -5414,7 +5414,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
           we need to build up a TARGET_EXPR.  */
        if (DECL_CONSTRUCTOR_P (convfn))
          {
-           expr = build_cplus_new (totype, expr);
+           expr = build_cplus_new (totype, expr, complain);
 
            /* Remember that this was list-initialization.  */
            if (convs->check_narrowing)
@@ -5559,7 +5559,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
          else if (diag_kind == DK_ERROR)
            return error_mark_node;
        }
-      return build_cplus_new (totype, expr);
+      return build_cplus_new (totype, expr, complain);
 
     case ck_ref_bind:
       {
@@ -6476,7 +6476,7 @@ build_cxx_call (tree fn, int nargs, tree *argarray)
     return error_mark_node;
 
   if (MAYBE_CLASS_TYPE_P (TREE_TYPE (fn)))
-    fn = build_cplus_new (TREE_TYPE (fn), fn);
+    fn = build_cplus_new (TREE_TYPE (fn), fn, tf_warning_or_error);
   return convert_from_reference (fn);
 }
 
@@ -8119,7 +8119,7 @@ perform_direct_initialization_if_possible (tree type,
       expr = build_special_member_call (NULL_TREE, complete_ctor_identifier,
                                        &args, type, LOOKUP_NORMAL, complain);
       release_tree_vector (args);
-      return build_cplus_new (type, expr);
+      return build_cplus_new (type, expr, complain);
     }
 
   /* Get the high-water mark for the CONVERSION_OBSTACK.  */
index 94bd3cee016cf35de68c4b5225665e31ceee56e3..ea251a8dbbd050e2e1c2c096968010f60d0c7eeb 100644 (file)
@@ -5395,8 +5395,8 @@ extern tree build_min                             (enum tree_code, tree, ...);
 extern tree build_min_nt                       (enum tree_code, ...);
 extern tree build_min_non_dep                  (enum tree_code, tree, ...);
 extern tree build_min_non_dep_call_vec         (tree, tree, VEC(tree,gc) *);
-extern tree build_cplus_new                    (tree, tree);
-extern tree build_aggr_init_expr               (tree, tree);
+extern tree build_cplus_new                    (tree, tree, tsubst_flags_t);
+extern tree build_aggr_init_expr               (tree, tree, tsubst_flags_t);
 extern tree get_target_expr                    (tree);
 extern tree build_cplus_array_type             (tree, tree);
 extern tree build_array_of_n_type              (tree, int);
index 290b926ebb725a8db54b28c499118e824bd554bc..6551de62ac31c8c88ba75e2427c4cd7147e39e11 100644 (file)
@@ -819,7 +819,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
          release_tree_vector (ctor_vec);
        }
       if (ctor)
-       return build_cplus_new (type, ctor);
+       return build_cplus_new (type, ctor, tf_warning_or_error);
     }
 
   if (flags & LOOKUP_COMPLAIN)
index 005f8d6dfe22230bcfa7de1a9d5c50659ae2caff..313169072b4ab969322163330a683cffc4228927 100644 (file)
@@ -342,7 +342,8 @@ build_value_init (tree type, tsubst_flags_t complain)
          (type,
           build_special_member_call (NULL_TREE, complete_ctor_identifier,
                                      NULL, type, LOOKUP_NORMAL,
-                                     complain));
+                                     complain),
+          complain);
       else if (TREE_CODE (type) != UNION_TYPE && TYPE_NEEDS_CONSTRUCTING (type))
        {
          /* This is a class that needs constructing, but doesn't have
@@ -354,7 +355,7 @@ build_value_init (tree type, tsubst_flags_t complain)
             NULL, type, LOOKUP_NORMAL, complain);
          if (ctor != error_mark_node)
            {
-             ctor = build_aggr_init_expr (type, ctor);
+             ctor = build_aggr_init_expr (type, ctor, complain);
              AGGR_INIT_ZERO_FIRST (ctor) = 1;
            }
          return ctor;
index 5cbba334dbebbb03c81a2ea3d1f4cbf70795ffc9..30175afaaa5fa26647b491ae88cc16778101022c 100644 (file)
@@ -8429,7 +8429,7 @@ maybe_add_lambda_conv_op (tree type)
                       VEC_address (tree, argvec));
   CALL_FROM_THUNK_P (call) = 1;
   if (MAYBE_CLASS_TYPE_P (TREE_TYPE (call)))
-    call = build_cplus_new (TREE_TYPE (call), call);
+    call = build_cplus_new (TREE_TYPE (call), call, tf_warning_or_error);
   call = convert_from_reference (call);
   finish_return_stmt (call);
 
index 070ba810a49fcd3e0ba788ab9209edea0e5bbbdb..c2aa389875a01dceba486376c4e140f825d2c3e2 100644 (file)
@@ -373,7 +373,7 @@ build_aggr_init_array (tree return_type, tree fn, tree slot, int nargs,
    callable.  */
 
 tree
-build_aggr_init_expr (tree type, tree init)
+build_aggr_init_expr (tree type, tree init, tsubst_flags_t complain)
 {
   tree fn;
   tree slot;
@@ -382,7 +382,9 @@ build_aggr_init_expr (tree type, tree init)
 
   /* Make sure that we're not trying to create an instance of an
      abstract class.  */
-  abstract_virtuals_error (NULL_TREE, type);
+  if (abstract_virtuals_error_sfinae (NULL_TREE, type, complain)
+      && !(complain & tf_error))
+    return error_mark_node;
 
   if (TREE_CODE (init) == CALL_EXPR)
     fn = CALL_EXPR_FN (init);
@@ -437,9 +439,9 @@ build_aggr_init_expr (tree type, tree init)
    and language-specific expression expanders.  */
 
 tree
-build_cplus_new (tree type, tree init)
+build_cplus_new (tree type, tree init, tsubst_flags_t complain)
 {
-  tree rval = build_aggr_init_expr (type, init);
+  tree rval = build_aggr_init_expr (type, init, complain);
   tree slot;
 
   if (TREE_CODE (rval) == AGGR_INIT_EXPR)
@@ -1805,7 +1807,8 @@ bot_manip (tree* tp, int* walk_subtrees, void* data)
       tree u;
 
       if (TREE_CODE (TREE_OPERAND (t, 1)) == AGGR_INIT_EXPR)
-       u = build_cplus_new (TREE_TYPE (t), TREE_OPERAND (t, 1));
+       u = build_cplus_new (TREE_TYPE (t), TREE_OPERAND (t, 1),
+                            tf_warning_or_error);
       else
        u = build_target_expr_with_type (TREE_OPERAND (t, 1), TREE_TYPE (t));
 
index a45ed2d7f044008d014fefbf5c03b9f888436436..71cfd8c6cf08ebd4011387894883f50303bc1b72 100644 (file)
@@ -5320,7 +5320,7 @@ unary_complex_lvalue (enum tree_code code, tree arg)
        if (TREE_CODE (arg) == SAVE_EXPR)
          targ = arg;
        else
-         targ = build_cplus_new (TREE_TYPE (arg), arg);
+         targ = build_cplus_new (TREE_TYPE (arg), arg, tf_warning_or_error);
        return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), targ);
       }
 
@@ -6742,7 +6742,7 @@ cp_build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs,
     {
       if (TREE_CODE (newrhs) == CALL_EXPR
          && TYPE_NEEDS_CONSTRUCTING (lhstype))
-       newrhs = build_cplus_new (lhstype, newrhs);
+       newrhs = build_cplus_new (lhstype, newrhs, complain);
 
       /* Can't initialize directly from a TARGET_EXPR, since that would
         cause the lhs to be constructed twice, and possibly result in
index f3a0079015070db8c697128458b5754e2309b124..f67073bb5c87cfcf099b139c1bcbb684ab71309e 100644 (file)
@@ -1614,7 +1614,7 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain)
   if (exp == error_mark_node)
     return error_mark_node;
 
-  return build_cplus_new (type, exp);
+  return build_cplus_new (type, exp, complain);
 }
 \f