re PR c++/13092 (Accepts invalid pointer-to-member conversion)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Tue, 1 Jun 2004 15:51:56 +0000 (15:51 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 1 Jun 2004 15:51:56 +0000 (11:51 -0400)
        PR c++/13092
        * init.c (build_offset_ref): Build SCOPE_REF with non-null
        TREE_TYPE for non-dependent names.
        * pt.c (type_dependent_expression_p): Handle SCOPE_REF with
        unknown_type_node as its TREE_TYPE.
        * cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK.
        * error.c (dump_decl) <SCOPE_REF case>: Use pp_expression.
        (dump_expr) <SCOPE_REF case>: Likewise.

From-SVN: r82551

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/cxx-pretty-print.c
gcc/cp/error.c
gcc/cp/init.c
gcc/cp/pt.c

index 7229ffc37ac023d825b1db75ed07522b8e964235..22277beadacc7d91971e6c6636a2f13ac4d5403b 100644 (file)
@@ -1,3 +1,14 @@
+2004-06-01  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/13092
+       * init.c (build_offset_ref): Build SCOPE_REF with non-null
+       TREE_TYPE for non-dependent names.
+       * pt.c (type_dependent_expression_p): Handle SCOPE_REF with
+       unknown_type_node as its TREE_TYPE.
+       * cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK.
+       * error.c (dump_decl) <SCOPE_REF case>: Use pp_expression.
+       (dump_expr) <SCOPE_REF case>: Likewise.
+
 2004-06-01  Richard Henderson  <rth@redhat.com>
            Andrew Pinski  <pinskia@physics.uc.edu>
 
index ecace2dd78ea7dc48edd6df62a6110dc29a939e9..185c0376c6940ef693400c873596363d61e75956 100644 (file)
@@ -4326,18 +4326,20 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
 }
 
 /* Build a call to __builtin_trap which can be used as an expression of
-   type TYPE.  */
+   type TYPE.  This looks like  *(__builtin_trap(), (TYPE*)NULL).  */
 
 static tree
 call_builtin_trap (tree type)
 {
   tree fn = implicit_built_in_decls[BUILT_IN_TRAP];
+  tree t;
 
   my_friendly_assert (fn != NULL, 20030927);
   fn = build_call (fn, NULL_TREE);
-  fn = build (COMPOUND_EXPR, type, fn, error_mark_node);
-  fn = force_target_expr (type, fn);
-  return fn;
+  t = convert (build_pointer_type (type), null_node);
+  t = build (COMPOUND_EXPR, TREE_TYPE (t), fn, t);
+  t = build_indirect_ref (t, NULL);
+  return t;
 }
 
 /* ARG is being passed to a varargs function.  Perform any conversions
index c5e667d9495f9efbaff808f07c0a5e467558d6e8..328ece0f3327c148a6ac34ad837f4f81c113124e 100644 (file)
@@ -180,6 +180,10 @@ pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
       pp_cxx_template_id (pp, t);
       break;
 
+    case BASELINK:
+      pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t));
+      break;
+
     case RECORD_TYPE:
     case UNION_TYPE:
     case ENUMERAL_TYPE:
index 6e186503bad925328ceccb6d533042be94f66248..faa2bfbef0c9c8d8bb8fc06c405f9f15d02a7674 100644 (file)
@@ -771,9 +771,7 @@ dump_decl (tree t, int flags)
       break;
 
     case SCOPE_REF:
-      dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS);
-      pp_colon_colon (cxx_pp); 
-      dump_decl (TREE_OPERAND (t, 1), flags);
+      pp_expression (cxx_pp, t);
       break;
 
     case ARRAY_REF:
@@ -1699,9 +1697,7 @@ dump_expr (tree t, int flags)
       break;
 
     case SCOPE_REF:
-      dump_type (TREE_OPERAND (t, 0), flags);
-      pp_colon_colon (cxx_pp);
-      dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
+      pp_expression (cxx_pp, t);
       break;
 
     case CAST_EXPR:
index 1c003566108f05570478a0f08b264b0b0a4021c9..5f0872e80cdc9b8d6bb37fbf96705471da0594e1 100644 (file)
@@ -1368,7 +1368,7 @@ build_offset_ref (tree type, tree name, bool address_p)
   if (TREE_CODE (name) == TEMPLATE_DECL)
     return name;
 
-  if (processing_template_decl || uses_template_parms (type))
+  if (dependent_type_p (type) || type_dependent_expression_p (name))
     return build_min_nt (SCOPE_REF, type, name);
 
   if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
@@ -1450,6 +1450,14 @@ build_offset_ref (tree type, tree name, bool address_p)
       return error_mark_node;
     }
 
+  if (processing_template_decl)
+    {
+      if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
+       return build_min (SCOPE_REF, TREE_TYPE (member), type, orig_name);
+      else
+       return build_min (SCOPE_REF, TREE_TYPE (member), type, name);
+    }
+
   if (TREE_CODE (member) == TYPE_DECL)
     {
       TREE_USED (member) = 1;
index cbe4bd9b0707fd6c4d5987540f887aa65351487f..824e8bf5aa014283abefd488ecaf05ae21e7ad04 100644 (file)
@@ -11932,22 +11932,6 @@ type_dependent_expression_p (tree expression)
        return dependent_type_p (type);
     }
 
-  if (TREE_CODE (expression) == SCOPE_REF
-      && dependent_scope_ref_p (expression,
-                               type_dependent_expression_p))
-    return true;
-
-  if (TREE_CODE (expression) == FUNCTION_DECL
-      && DECL_LANG_SPECIFIC (expression)
-      && DECL_TEMPLATE_INFO (expression)
-      && (any_dependent_template_arguments_p
-         (INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (expression)))))
-    return true;
-
-  if (TREE_CODE (expression) == TEMPLATE_DECL
-      && !DECL_TEMPLATE_TEMPLATE_PARM_P (expression))
-    return false;
-
   if (TREE_TYPE (expression) == unknown_type_node)
     {
       if (TREE_CODE (expression) == ADDR_EXPR)
@@ -11961,7 +11945,9 @@ type_dependent_expression_p (tree expression)
          if (TREE_CODE (expression) == IDENTIFIER_NODE)
            return false;
        }
-      
+      if (TREE_CODE (expression) == SCOPE_REF)
+       return false;
+
       if (TREE_CODE (expression) == BASELINK)
        expression = BASELINK_FUNCTIONS (expression);
       if (TREE_CODE (expression) == TEMPLATE_ID_EXPR)
@@ -11984,6 +11970,22 @@ type_dependent_expression_p (tree expression)
       abort ();
     }
   
+  if (TREE_CODE (expression) == SCOPE_REF
+      && dependent_scope_ref_p (expression,
+                               type_dependent_expression_p))
+    return true;
+
+  if (TREE_CODE (expression) == FUNCTION_DECL
+      && DECL_LANG_SPECIFIC (expression)
+      && DECL_TEMPLATE_INFO (expression)
+      && (any_dependent_template_arguments_p
+         (INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (expression)))))
+    return true;
+
+  if (TREE_CODE (expression) == TEMPLATE_DECL
+      && !DECL_TEMPLATE_TEMPLATE_PARM_P (expression))
+    return false;
+
   return (dependent_type_p (TREE_TYPE (expression)));
 }