From: Mark Mitchell Date: Thu, 23 Jan 2003 00:17:32 +0000 (+0000) Subject: re PR c++/9328 (ICE with templates and namespace std members) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=65a5559bdf97989997b12c372ef4c77dd4740b19;p=gcc.git re PR c++/9328 (ICE with templates and namespace std members) PR c++/9328 * g++.dg/ext/typeof3.C: New test. 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. From-SVN: r61631 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f8710774ef3..9be5f7660f1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2003-01-22 Mark Mitchell + 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 d9bc5528ab8..d53943f3715 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 adba8a5172a..19808e68583 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 80d67eec93e..fb0a778d25e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-01-22 Mark Mitchell + + PR c++/9328 + * g++.dg/ext/typeof3.C: New test. + 2003-01-22 Volker Reichelt 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 00000000000..cf78c7c6196 --- /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 "" } +