diff options
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/error.c | 19 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/typeof3.C | 4 |
5 files changed, 47 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f871077..9be5f76 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2003-01-22 Mark Mitchell <mark@codesourcery.com> + PR c++/9328 + * error.c (dump_decl): For an OVERLOAD, just print the name of the + function; it doesn't make sense to try to print its type. + * semantics.c (finish_typeof): Issue errors about invalid uses. + PR c++/9298 * parser.c (cp_parser_consume_semicolon_at_end_of_statement): New function. diff --git a/gcc/cp/error.c b/gcc/cp/error.c index d9bc552..d53943f 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -929,6 +929,25 @@ dump_decl (t, flags) break; case OVERLOAD: + if (OVL_CHAIN (t)) + { + t = OVL_CURRENT (t); + if (DECL_CLASS_SCOPE_P (t)) + { + dump_type (DECL_CONTEXT (t), flags); + output_add_string (scratch_buffer, "::"); + } + else if (DECL_CONTEXT (t)) + { + dump_decl (DECL_CONTEXT (t), flags); + output_add_string (scratch_buffer, "::"); + } + dump_decl (DECL_NAME (t), flags); + break; + } + + /* If there's only one function, just treat it like an ordinary + FUNCTION_DECL. */ t = OVL_CURRENT (t); /* Fall through. */ diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index adba8a5..19808e6 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2136,20 +2136,28 @@ tree finish_typeof (expr) tree expr; { + tree type; + if (processing_template_decl) { - tree t; + type = make_aggr_type (TYPEOF_TYPE); + TYPE_FIELDS (type) = expr; - t = make_aggr_type (TYPEOF_TYPE); - TYPE_FIELDS (t) = expr; - - return t; + return type; } if (TREE_CODE (expr) == OFFSET_REF) expr = resolve_offset_ref (expr); - return TREE_TYPE (expr); + type = TREE_TYPE (expr); + + if (!type || type == unknown_type_node) + { + error ("type of `%E' is unknown", expr); + return error_mark_node; + } + + return type; } /* Compute the value of the `sizeof' operator. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 80d67ee..fb0a778 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-01-22 Mark Mitchell <mark@codesourcery.com> + + PR c++/9328 + * g++.dg/ext/typeof3.C: New test. + 2003-01-22 Volker Reichelt <reichelt@igpm.rwth-aachen.de> PR c++/2738 diff --git a/gcc/testsuite/g++.dg/ext/typeof3.C b/gcc/testsuite/g++.dg/ext/typeof3.C new file mode 100644 index 0000000..cf78c7c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof3.C @@ -0,0 +1,4 @@ +double f(double); +float f(float); +void h(typeof(f) g) {} // { dg-error "" } + |