* call.c (build_object_call): Don't look at DECL_NAME for a type.
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 20 May 1999 17:19:29 +0000 (17:19 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 20 May 1999 17:19:29 +0000 (17:19 +0000)
(pt.c): Or CP_TYPE_QUALS for an ERROR_MARK.
(typeck.c): Or TYPE_MAIN_VARIANT for a type.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@27068 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/pt.c
gcc/cp/typeck.c

index 9ade541..d306b09 100644 (file)
@@ -1,5 +1,9 @@
 1999-05-20  Mark Mitchell  <mark@codesourcery.com>
 
+       * call.c (build_object_call): Don't look at DECL_NAME for a type.
+       (pt.c): Or CP_TYPE_QUALS for an ERROR_MARK.
+       (typeck.c): Or TYPE_MAIN_VARIANT for a type.
+
        * pt.c (for_each_template_parm): Rework to match documentation.
        Don't be fooled by a COMPONENT_REF with no TREE_TYPE.
 
index e4b1a00..e6f4187 100644 (file)
@@ -2336,7 +2336,11 @@ build_object_call (obj, args)
       return error_mark_node;
     }
 
-  if (DECL_NAME (cand->fn) == ansi_opname [CALL_EXPR])
+  /* Since cand->fn will be a type, not a function, for a conversion
+     function, we must be careful not to unconditionally look at
+     DECL_NAME here.  */
+  if (TREE_CODE (cand->fn) == FUNCTION_DECL
+      && DECL_NAME (cand->fn) == ansi_opname [CALL_EXPR])
     return build_over_call (cand, mem_args, LOOKUP_NORMAL);
 
   obj = convert_like (TREE_VEC_ELT (cand->convs, 0), obj);
index b26fecb..e486920 100644 (file)
@@ -6541,6 +6541,8 @@ tsubst (t, args, complain, in_decl)
          }
 
        f = make_typename_type (ctx, f);
+       if (f == error_mark_node)
+         return f;
        return cp_build_qualified_type (f, 
                                        CP_TYPE_QUALS (f) 
                                        | CP_TYPE_QUALS (t));
index cdc012e..c8c11ca 100644 (file)
@@ -5077,17 +5077,20 @@ build_conditional_expr (ifexp, op1, op2)
       ifexp = op1 = save_expr (ifexp);
     }
 
+  type1 = TREE_TYPE (op1);
+  code1 = TREE_CODE (type1);
+  type2 = TREE_TYPE (op2);
+  code2 = TREE_CODE (type2);
+  if (op1 == error_mark_node || op2 == error_mark_node
+      || type1 == error_mark_node || type2 == error_mark_node)
+    return error_mark_node;
+
   ifexp = cp_convert (boolean_type_node, ifexp);
 
   if (TREE_CODE (ifexp) == ERROR_MARK)
     return error_mark_node;
 
   /* C++: REFERENCE_TYPES must be dereferenced.  */
-  type1 = TREE_TYPE (op1);
-  code1 = TREE_CODE (type1);
-  type2 = TREE_TYPE (op2);
-  code2 = TREE_CODE (type2);
-
   if (code1 == REFERENCE_TYPE)
     {
       op1 = convert_from_reference (op1);