aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Stump <mrs@gcc.gnu.org>1995-11-03 23:01:39 +0000
committerMike Stump <mrs@gcc.gnu.org>1995-11-03 23:01:39 +0000
commit07674418af0855de6751d8e85ec7fec87f8c8ad3 (patch)
tree17cb019ff6bd4cb9c38bcfb6d7c95796c962c5c0
parentbe89f7bd13fe13d3f35c8faf389fb7733b8a5823 (diff)
downloadgcc-07674418af0855de6751d8e85ec7fec87f8c8ad3.zip
gcc-07674418af0855de6751d8e85ec7fec87f8c8ad3.tar.gz
gcc-07674418af0855de6751d8e85ec7fec87f8c8ad3.tar.bz2
merge in some last minute changes from jason, for jason.
From-SVN: r10544
-rw-r--r--gcc/cp/ChangeLog25
-rw-r--r--gcc/cp/call.c7
-rw-r--r--gcc/cp/parse.y22
-rw-r--r--gcc/cp/typeck.c14
4 files changed, 59 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c00f293..8e443cd 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,28 @@
+Fri Nov 3 17:58:52 1995 Mike Stump <mrs@cygnus.com>
+
+ * Version 2.7.1 released.
+
+Thu Nov 2 17:02:47 1995 Jason Merrill <jason@yorick.cygnus.com>
+
+ * call.c (convert_harshness): Handle references to arrays.
+
+Fri Oct 27 14:20:21 1995 Jason Merrill <jason@yorick.cygnus.com>
+
+ * typeck.c (comp_target_types): Check multi-level pointer
+ conversions in both directions.
+
+Tue Oct 17 21:39:05 1995 Jason Merrill <jason@yorick.cygnus.com>
+
+ * parse.y (explicit_instantiation): Fix 'extern template' with no
+ return type.
+
+Mon Oct 16 14:35:20 1995 Jason Merrill <jason@yorick.cygnus.com>
+
+ * parse.y (explicit_instantiation): Support automatic instantiation
+ of constructors.
+ (named_class_head_*): Support out-of-class definition of nested
+ types.
+
Wed Oct 11 12:20:56 1995 Mike Stump <mrs@cygnus.com>
* search.c (envelope_add_decl): New routine. Fix so that
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 2dd6cff..3f293ac 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -194,7 +194,12 @@ convert_harshness (type, parmtype, parm)
ttr = intype;
- /* Maybe handle conversion to base here? */
+ if (TREE_CODE (ttl) == ARRAY_TYPE && TREE_CODE (ttr) == ARRAY_TYPE)
+ {
+ if (comptypes (ttl, ttr, 1))
+ return ZERO_RETURN (h);
+ return EVIL_RETURN (h);
+ }
h = convert_harshness (ttl, ttr, NULL_TREE);
if (penalty && h.code == 0)
diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y
index e3204ed..fd034af 100644
--- a/gcc/cp/parse.y
+++ b/gcc/cp/parse.y
@@ -233,6 +233,7 @@ empty_parms ()
%type <ttype> fn.def2 return_id
%type <itype> ctor_initializer_opt
%type <ttype> named_class_head named_class_head_sans_basetype
+%type <ttype> named_complex_class_head_sans_basetype
%type <ttype> unnamed_class_head
%type <ttype> class_head base_class_list
%type <itype> base_class_access_list
@@ -820,11 +821,15 @@ explicit_instantiation:
| TEMPLATE typed_declspecs declarator
{ tree specs = strip_attrs ($2);
do_function_instantiation (specs, $3, NULL_TREE); }
+ | TEMPLATE notype_declarator
+ { do_function_instantiation (NULL_TREE, $2, NULL_TREE); }
| SCSPEC TEMPLATE specialization template_instantiation
{ do_type_instantiation ($4 ? $4 : $3, $1); }
| SCSPEC TEMPLATE typed_declspecs declarator
{ tree specs = strip_attrs ($3);
do_function_instantiation (specs, $4, $1); }
+ | SCSPEC TEMPLATE notype_declarator
+ { do_function_instantiation (NULL_TREE, $3, $1); }
;
template_type:
@@ -2286,10 +2291,6 @@ specialization:
named_class_head_sans_basetype:
aggr identifier
{ current_aggr = $$; $$ = $2; }
- | aggr complex_type_name
- { current_aggr = $$; $$ = $2; }
- | aggr template_type %prec EMPTY
- { current_aggr = $$; $$ = $2; }
| specialization
;
@@ -2306,6 +2307,13 @@ named_class_head_sans_basetype_defn:
{ yyungetc (':', 1); goto aggr2; }
;
+named_complex_class_head_sans_basetype:
+ aggr nested_name_specifier identifier
+ { current_aggr = $$; $$ = $3; }
+ | aggr template_type %prec EMPTY
+ { current_aggr = $$; $$ = $2; }
+ ;
+
do_xref_defn: /* empty */ %prec EMPTY
{ $<ttype>$ = xref_tag (current_aggr, $<ttype>0, NULL_TREE, 0); }
;
@@ -2320,6 +2328,12 @@ named_class_head:
if ($3)
xref_basetypes (current_aggr, $1, $<ttype>2, $3);
}
+ | named_complex_class_head_sans_basetype maybe_base_class_list
+ {
+ $$ = TREE_TYPE ($1);
+ if ($2)
+ xref_basetypes (current_aggr, $1, TREE_TYPE ($1), $2);
+ }
;
unnamed_class_head: aggr '{'
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index d4bab51..9247bf0 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -808,7 +808,13 @@ comp_target_types (ttl, ttr, nptrs)
return -1;
else if (TREE_CODE (ttl) == POINTER_TYPE
|| TREE_CODE (ttl) == ARRAY_TYPE)
- return comp_ptr_ttypes (ttl, ttr);
+ {
+ if (comp_ptr_ttypes (ttl, ttr))
+ return 1;
+ else if (comp_ptr_ttypes (ttr, ttl))
+ return -1;
+ return 0;
+ }
}
/* Const and volatile mean something different for function types,
@@ -6134,9 +6140,9 @@ build_modify_expr (lhs, modifycode, rhs)
newrhs = build_cplus_new (lhstype, newrhs, 0);
/* Can't initialize directly from a TARGET_EXPR, since that would
- cause the lhs to be constructed twice. So we force the
- TARGET_EXPR to be expanded. expand_expr should really do this
- by itself. */
+ cause the lhs to be constructed twice, and possibly result in
+ accidental self-initialization. So we force the TARGET_EXPR to be
+ expanded. expand_expr should really do this by itself. */
if (TREE_CODE (newrhs) == TARGET_EXPR)
newrhs = expand_target_expr (newrhs);
}