public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Candidate fix for PR c/7353
@ 2002-10-07 16:52 Zack Weinberg
  2002-10-07 22:59 ` Richard Henderson
  0 siblings, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2002-10-07 16:52 UTC (permalink / raw)
  To: gcc-patches

PR c/7353, distilled, reports that 

typedef A = 0;  /* equivalent to 'typedef int A;' */

produces an ICE with all versions of GCC since 3.0.  This is an
obscure, rarely-used extension, but if we're going to have it, it
should work.

There are two bugs.  One is that make_decl_rtl is being called on a
TYPE_DECL; it quite properly aborts.  The other is that the code for
handling 'typedef T = expr' was not updated when DECL_ORIGINAL_TYPE
was invented, so we abort in gen_typedef_die.

I believe this patch fixes the bug.  I have one remaining concern:
given

typedef A = 0;
A a;

gdb reports

(gdb) ptype a
type = int

Shouldn't that be type = A?  It does do the same thing for

typedef int B;
B b;

so perhaps this is as intended.

zw

	* c-decl.c (finish_decl): When processing 'typedef T = expr',
	TREE_TYPE (T) should be a copy of TREE_TYPE (expr), as is done
	for normal typedefs.
	* toplev.c (rest_of_decl_compilation): Do not call
	make_decl_rtl on TYPE_DECLs.

===================================================================
Index: c-decl.c
--- c-decl.c	22 Sep 2002 02:03:14 -0000	1.350
+++ c-decl.c	7 Oct 2002 23:45:48 -0000
@@ -2994,7 +2994,8 @@ finish_decl (decl, init, asmspec_tree)
       else
 	{
 	  /* typedef foo = bar; store the type of bar as the type of foo.  */
-	  TREE_TYPE (decl) = TREE_TYPE (init);
+	  TREE_TYPE (decl) = build_type_copy (TREE_TYPE (init));
+	  DECL_ORIGINAL_TYPE (decl) = TREE_TYPE (init);
 	  DECL_INITIAL (decl) = init = 0;
 	}
     }
===================================================================
Index: toplev.c
--- toplev.c	7 Oct 2002 03:01:39 -0000	1.679
+++ toplev.c	7 Oct 2002 23:45:52 -0000
@@ -2272,8 +2272,9 @@ rest_of_decl_compilation (decl, asmspec,
 
   /* Forward declarations for nested functions are not "external",
      but we need to treat them as if they were.  */
-  if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
-      || TREE_CODE (decl) == FUNCTION_DECL)
+  if (TREE_CODE (decl) == FUNCTION_DECL
+      || (TREE_CODE (decl) == VAR_DECL
+	  && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))))
     {
       timevar_push (TV_VARCONST);
 

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-07 16:52 Candidate fix for PR c/7353 Zack Weinberg
@ 2002-10-07 22:59 ` Richard Henderson
  2002-10-07 23:12   ` Neil Booth
  2002-10-07 23:57   ` Zack Weinberg
  0 siblings, 2 replies; 21+ messages in thread
From: Richard Henderson @ 2002-10-07 22:59 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: gcc-patches

On Mon, Oct 07, 2002 at 04:52:25PM -0700, Zack Weinberg wrote:
> typedef A = 0;  /* equivalent to 'typedef int A;' */

Huh?  Oh blah.

Clearly the existing "typedef __typeof(0) A;" extension
was too obvious.  I suppose I'm being unfair; it's possible
that this one came first.  Certainly the later is more
generically useful though.

> produces an ICE with all versions of GCC since 3.0.  This is an
> obscure, rarely-used extension, but if we're going to have it, it
> should work.

I'm for nuking it myself.  If there's not unanimous agreement,
I guess I'll look at your patch tomorrow.

> Shouldn't that be type = A?  It does do the same thing for
> 
> typedef int B;
> B b;
> 
> so perhaps this is as intended.

Yes, that's intended.


r~

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-07 22:59 ` Richard Henderson
@ 2002-10-07 23:12   ` Neil Booth
  2002-10-08 18:33     ` Phil Edwards
  2002-10-09 11:30     ` Mike Stump
  2002-10-07 23:57   ` Zack Weinberg
  1 sibling, 2 replies; 21+ messages in thread
From: Neil Booth @ 2002-10-07 23:12 UTC (permalink / raw)
  To: Richard Henderson, Zack Weinberg, gcc-patches

Richard Henderson wrote:-

> > produces an ICE with all versions of GCC since 3.0.  This is an
> > obscure, rarely-used extension, but if we're going to have it, it
> > should work.
> 
> I'm for nuking it myself.

I concur.  It's really ugly.

Neil.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-07 22:59 ` Richard Henderson
  2002-10-07 23:12   ` Neil Booth
@ 2002-10-07 23:57   ` Zack Weinberg
  2002-10-08  2:58     ` Michael Matz
                       ` (2 more replies)
  1 sibling, 3 replies; 21+ messages in thread
From: Zack Weinberg @ 2002-10-07 23:57 UTC (permalink / raw)
  To: Richard Henderson, gcc-patches

On Mon, Oct 07, 2002 at 10:59:31PM -0700, Richard Henderson wrote:
> > produces an ICE with all versions of GCC since 3.0.  This is an
> > obscure, rarely-used extension, but if we're going to have it, it
> > should work.
> 
> I'm for nuking it myself.  If there's not unanimous agreement,
> I guess I'll look at your patch tomorrow.

It's a documented extension, so we might want to deprecate it for a
release before making it go away, but since it's been broken since 3.0
and only one person has complained, I certainly wouldn't object to
killing it immediately.

Here's a patch to eliminate it altogether, so all alternatives will be
on the table.  (Note that C++ generates three error messages for the
construct with this patch, which is overkill IMO.)

zw

	* c-decl.c (start_decl): It is always an error to write
	"typedef T = expr;".
	(finish_decl): Remove special case for TYPE_DECL with nonzero INIT.
	* cp/decl.c: Likewise.

	* doc/extend.texi: Delete documentation of "typedef T = expr;"
	extension.  Move useful example there to the "typeof" section,
	and rewrite it to use that extension instead.  Delete silly
	typeof example.  Change cross-references to "Naming Types" to
	refer to "Typeof" instead.

===================================================================
Index: c-decl.c
--- c-decl.c	22 Sep 2002 02:03:14 -0000	1.350
+++ c-decl.c	8 Oct 2002 06:47:21 -0000
@@ -2821,15 +2821,9 @@ start_decl (declarator, declspecs, initi
     switch (TREE_CODE (decl))
       {
       case TYPE_DECL:
-	/* typedef foo = bar  means give foo the same type as bar.
-	   We haven't parsed bar yet, so `finish_decl' will fix that up.
-	   Any other case of an initialization in a TYPE_DECL is an error.  */
-	if (pedantic || list_length (declspecs) > 1)
-	  {
-	    error ("typedef `%s' is initialized",
-		   IDENTIFIER_POINTER (DECL_NAME (decl)));
-	    initialized = 0;
-	  }
+	error ("typedef `%s' is initialized",
+	       IDENTIFIER_POINTER (DECL_NAME (decl)));
+	initialized = 0;
 	break;
 
       case FUNCTION_DECL:
@@ -2988,16 +2982,7 @@ finish_decl (decl, init, asmspec_tree)
     init = 0;
 
   if (init)
-    {
-      if (TREE_CODE (decl) != TYPE_DECL)
-	store_init_value (decl, init);
-      else
-	{
-	  /* typedef foo = bar; store the type of bar as the type of foo.  */
-	  TREE_TYPE (decl) = TREE_TYPE (init);
-	  DECL_INITIAL (decl) = init = 0;
-	}
-    }
+    store_init_value (decl, init);
 
   /* Deduce size of array from initialization, if not already known */
   if (TREE_CODE (type) == ARRAY_TYPE
===================================================================
Index: cp/decl.c
--- cp/decl.c	2 Oct 2002 18:46:40 -0000	1.942
+++ cp/decl.c	8 Oct 2002 06:53:42 -0000
@@ -7290,14 +7290,8 @@ start_decl (declarator, declspecs, initi
     switch (TREE_CODE (decl))
       {
       case TYPE_DECL:
-	/* typedef foo = bar  means give foo the same type as bar.
-	   We haven't parsed bar yet, so `cp_finish_decl' will fix that up.
-	   Any other case of an initialization in a TYPE_DECL is an error.  */
-	if (pedantic || list_length (declspecs) > 1)
-	  {
-	    error ("typedef `%D' is initialized", decl);
-	    initialized = 0;
-	  }
+	error ("typedef `%D' is initialized", decl);
+	initialized = 0;
 	break;
 
       case FUNCTION_DECL:
@@ -8156,12 +8150,6 @@ cp_finish_decl (decl, init, asmspec_tree
   /* Take care of TYPE_DECLs up front.  */
   if (TREE_CODE (decl) == TYPE_DECL)
     {
-      if (init && DECL_INITIAL (decl))
-	{
-	  /* typedef foo = bar; store the type of bar as the type of foo.  */
-	  TREE_TYPE (decl) = type = TREE_TYPE (init);
-	  DECL_INITIAL (decl) = init = NULL_TREE;
-	}
       if (type != error_mark_node
 	  && IS_AGGR_TYPE (type) && DECL_NAME (decl))
 	{
===================================================================
Index: doc/extend.texi
--- doc/extend.texi	27 Sep 2002 13:30:07 -0000	1.104
+++ doc/extend.texi	8 Oct 2002 06:47:23 -0000
@@ -427,7 +427,6 @@ extensions, accepted by GCC in C89 mode 
 * Labels as Values::    Getting pointers to labels, and computed gotos.
 * Nested Functions::    As in Algol and Pascal, lexical scoping of functions.
 * Constructing Calls::	Dispatching a call to another function.
-* Naming Types::        Giving a name to the type of some expression.
 * Typeof::              @code{typeof}: referring to the type of an expression.
 * Lvalues::             Using @samp{?:}, @samp{,} and casts in lvalues.
 * Conditionals::        Omitting the middle operand of a @samp{?:} expression.
@@ -538,8 +537,7 @@ the value of an enumeration constant, th
 the initial value of a static variable.
 
 If you don't know the type of the operand, you can still do this, but you
-must use @code{typeof} (@pxref{Typeof}) or type naming (@pxref{Naming
-Types}).
+must use @code{typeof} (@pxref{Typeof}).
 
 Statement expressions are not supported fully in G++, and their fate
 there is unclear.  (It is possible that they will become fully supported
@@ -888,29 +886,6 @@ the containing function.  You should spe
 returned by @code{__builtin_apply}.
 @end deftypefn
 
-@node Naming Types
-@section Naming an Expression's Type
-@cindex naming types
-
-You can give a name to the type of an expression using a @code{typedef}
-declaration with an initializer.  Here is how to define @var{name} as a
-type name for the type of @var{exp}:
-
-@example
-typedef @var{name} = @var{exp};
-@end example
-
-This is useful in conjunction with the statements-within-expressions
-feature.  Here is how the two together can be used to define a safe
-``maximum'' macro that operates on any arithmetic type:
-
-@example
-#define max(a,b) \
-  (@{typedef _ta = (a), _tb = (b);  \
-    _ta _a = (a); _tb _b = (b);     \
-    _a > _b ? _a : _b; @})
-@end example
-
 @cindex underscores in variables in macros
 @cindex @samp{_} in variables in macros
 @cindex local variables in macros
@@ -962,6 +937,20 @@ A @code{typeof}-construct can be used an
 used.  For example, you can use it in a declaration, in a cast, or inside
 of @code{sizeof} or @code{typeof}.
 
+@code{typeof} is often useful in conjunction with the
+statements-within-expressions feature.  Here is how the two together can
+be used to define a safe ``maximum'' macro that operates on any
+arithmetic type and evaluates each of its arguments exactly once:
+
+@example
+#define max(a,b) \
+  (@{ typeof (a) _a = (a); \
+      typeof (b) _b = (b); \
+    _a > _b ? _a : _b; @})
+@end example
+
+Some more examples of the use of @code{typeof}:
+
 @itemize @bullet
 @item
 This declares @code{y} with the type of what @code{x} points to.
@@ -976,39 +965,6 @@ This declares @code{y} as an array of su
 @example
 typeof (*x) y[4];
 @end example
-
-@item
-This declares @code{y} as an array of pointers to characters:
-
-@example
-typeof (typeof (char *)[4]) y;
-@end example
-
-@noindent
-It is equivalent to the following traditional C declaration:
-
-@example
-char *y[4];
-@end example
-
-To see the meaning of the declaration using @code{typeof}, and why it
-might be a useful way to write, let's rewrite it with these macros:
-
-@example
-#define pointer(T)  typeof(T *)
-#define array(T, N) typeof(T [N])
-@end example
-
-@noindent
-Now the declaration can be rewritten this way:
-
-@example
-array (pointer (char), 4) y;
-@end example
-
-@noindent
-Thus, @code{array (pointer (char), 4)} is the type of arrays of 4
-pointers to @code{char}.
 @end itemize
 
 @node Lvalues
@@ -6827,12 +6783,12 @@ the minimum value of variables @var{i} a
 
 However, side effects in @code{X} or @code{Y} may cause unintended
 behavior.  For example, @code{MIN (i++, j++)} will fail, incrementing
-the smaller counter twice.  A GNU C extension allows you to write safe
-macros that avoid this kind of problem (@pxref{Naming Types,,Naming an
-Expression's Type}).  However, writing @code{MIN} and @code{MAX} as
-macros also forces you to use function-call notation for a
-fundamental arithmetic operation.  Using GNU C++ extensions, you can
-write @w{@samp{int min = i <? j;}} instead.
+the smaller counter twice.  The GNU C @code{typeof} extension allows you
+to write safe macros that avoid this kind of problem (@pxref{Typeof}).
+However, writing @code{MIN} and @code{MAX} as macros also forces you to
+use function-call notation for a fundamental arithmetic operation.
+Using GNU C++ extensions, you can write @w{@samp{int min = i <? j;}}
+instead.
 
 Since @code{<?} and @code{>?} are built into the compiler, they properly
 handle expressions with side-effects;  @w{@samp{int min = i++ <? j++;}}

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-07 23:57   ` Zack Weinberg
@ 2002-10-08  2:58     ` Michael Matz
  2002-10-08 11:04     ` Richard Henderson
  2002-10-09  1:09     ` Joseph S. Myers
  2 siblings, 0 replies; 21+ messages in thread
From: Michael Matz @ 2002-10-08  2:58 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: gcc-patches

Hi,

On Mon, 7 Oct 2002, Zack Weinberg wrote:

> 	and rewrite it to use that extension instead.  Delete silly
> 	typeof example.

Why?  It might be silly (define that ;-p) but adds a clarifying example on
the effect of typeof in connection with the non-trivial syntax of
declaring types in C.


Ciao,
Michael.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-07 23:57   ` Zack Weinberg
  2002-10-08  2:58     ` Michael Matz
@ 2002-10-08 11:04     ` Richard Henderson
  2002-10-09  1:09     ` Joseph S. Myers
  2 siblings, 0 replies; 21+ messages in thread
From: Richard Henderson @ 2002-10-08 11:04 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: gcc-patches

On Mon, Oct 07, 2002 at 11:57:33PM -0700, Zack Weinberg wrote:
> 	* c-decl.c (start_decl): It is always an error to write
> 	"typedef T = expr;".
> 	(finish_decl): Remove special case for TYPE_DECL with nonzero INIT.
> 	* cp/decl.c: Likewise.
> 
> 	* doc/extend.texi: Delete documentation of "typedef T = expr;"
> 	extension.  Move useful example there to the "typeof" section,
> 	and rewrite it to use that extension instead.  Delete silly
> 	typeof example.  Change cross-references to "Naming Types" to
> 	refer to "Typeof" instead.

This is fine with me.


r~

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-07 23:12   ` Neil Booth
@ 2002-10-08 18:33     ` Phil Edwards
  2002-10-09 11:30     ` Mike Stump
  1 sibling, 0 replies; 21+ messages in thread
From: Phil Edwards @ 2002-10-08 18:33 UTC (permalink / raw)
  To: Neil Booth; +Cc: Richard Henderson, Zack Weinberg, gcc-patches

On Tue, Oct 08, 2002 at 07:11:58AM +0100, Neil Booth wrote:
> Richard Henderson wrote:-
> 
> > > produces an ICE with all versions of GCC since 3.0.  This is an
> > > obscure, rarely-used extension, but if we're going to have it, it
> > > should work.
> > 
> > I'm for nuking it myself.
> 
> I concur.  It's really ugly.

That's putting it lightly.  Anybody writing "typedef X = 0;" needs to
be beaten about the head with a broken bottle (for punishment) and then
forced to read K&P's "The Practice of Programming" (for proper re-education).


Phil

-- 
I would therefore like to posit that computing's central challenge, viz. "How
not to make a mess of it," has /not/ been met.
                                                 - Edsger Dijkstra, 1930-2002

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-07 23:57   ` Zack Weinberg
  2002-10-08  2:58     ` Michael Matz
  2002-10-08 11:04     ` Richard Henderson
@ 2002-10-09  1:09     ` Joseph S. Myers
  2002-10-09  9:50       ` Mark Mitchell
  2002-10-09  9:55       ` Zack Weinberg
  2 siblings, 2 replies; 21+ messages in thread
From: Joseph S. Myers @ 2002-10-09  1:09 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: Richard Henderson, gcc-patches

On Mon, 7 Oct 2002, Zack Weinberg wrote:

> It's a documented extension, so we might want to deprecate it for a
> release before making it go away, but since it's been broken since 3.0
> and only one person has complained, I certainly wouldn't object to
> killing it immediately.
> 
> Here's a patch to eliminate it altogether, so all alternatives will be
> on the table.  (Note that C++ generates three error messages for the
> construct with this patch, which is overkill IMO.)

You need testcases (C and C++) for removal of this feature and an entry in
the 3.3 release notes - but removing it now without a deprecation period
is OK by me (if the Release Manager approves it for this development
stage).

-- 
Joseph S. Myers
jsm28@cam.ac.uk

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-09  1:09     ` Joseph S. Myers
@ 2002-10-09  9:50       ` Mark Mitchell
  2002-10-09 10:01         ` Zack Weinberg
  2002-10-09  9:55       ` Zack Weinberg
  1 sibling, 1 reply; 21+ messages in thread
From: Mark Mitchell @ 2002-10-09  9:50 UTC (permalink / raw)
  To: Joseph S. Myers, Zack Weinberg; +Cc: Richard Henderson, gcc-patches



--On Wednesday, October 09, 2002 09:09:06 AM +0100 "Joseph S. Myers" 
<jsm28@cam.ac.uk> wrote:

> On Mon, 7 Oct 2002, Zack Weinberg wrote:
>
>> It's a documented extension, so we might want to deprecate it for a
>> release before making it go away, but since it's been broken since 3.0
>> and only one person has complained, I certainly wouldn't object to
>> killing it immediately.
>>
>> Here's a patch to eliminate it altogether, so all alternatives will be
>> on the table.  (Note that C++ generates three error messages for the
>> construct with this patch, which is overkill IMO.)
>
> You need testcases (C and C++) for removal of this feature and an entry in
> the 3.3 release notes - but removing it now without a deprecation period
> is OK by me (if the Release Manager approves it for this development
> stage).

Go ahead and remove the extension, making the mods Joseph requests.

Thanks,

-- 
Mark Mitchell                mark@codesourcery.com
CodeSourcery, LLC            http://www.codesourcery.com

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-09  1:09     ` Joseph S. Myers
  2002-10-09  9:50       ` Mark Mitchell
@ 2002-10-09  9:55       ` Zack Weinberg
  2002-10-09 10:01         ` Mark Mitchell
  1 sibling, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2002-10-09  9:55 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: Richard Henderson, Mark Mitchell, gcc-patches

On Wed, Oct 09, 2002 at 09:09:06AM +0100, Joseph S. Myers wrote:
> On Mon, 7 Oct 2002, Zack Weinberg wrote:
> > It's a documented extension, so we might want to deprecate it for a
> > release before making it go away, but since it's been broken since 3.0
> > and only one person has complained, I certainly wouldn't object to
> > killing it immediately.
> > 
> > Here's a patch to eliminate it altogether, so all alternatives will be
> > on the table.  (Note that C++ generates three error messages for the
> > construct with this patch, which is overkill IMO.)
> 
> You need testcases (C and C++) for removal of this feature and an entry in
> the 3.3 release notes - but removing it now without a deprecation period
> is OK by me (if the Release Manager approves it for this development
> stage).

Here is a revised patch, which has survived bootstrap and test suite,
has both C and C++ test cases, gets rid of the duplicate error message
in C++, and I put back the typeof example that some people seem to
like.  A candidate addition to the release notes is at the end.  Mark,
what do you think of this solution to the PR?

We should also do something on the 3.2 branch - thoughts?

zw

gcc:
	* c-decl.c (start_decl): Unconditionally issue error for
	'typedef foo = bar'.
	(finish_decl): Remove special case for TYPE_DECL with initializer.

	* doc/extend.texi: Delete "Naming Types" section.  Change all
	cross-references to that section to refer to "Typeof" instead.
	Add the useful safe-max()-macro example from "Naming Types" to
	"Typeof", rewritten using that extension.

gcc/cp:
	* decl.c (start_decl): Unconditionally issue error for
	'typedef foo = bar'.
	(cp_finish_decl): Remove special case for TYPE_DECL with initializer.
	(grokdeclarator): Remove redundant error for 'typedef foo = bar'.

gcc/testsuite:
	* g++.dg/ext/typedef-init.C: New test.
	* gcc.dg/typedef-init.c: New test.

===================================================================
Index: c-decl.c
--- c-decl.c	22 Sep 2002 02:03:14 -0000	1.350
+++ c-decl.c	9 Oct 2002 16:44:25 -0000
@@ -2821,15 +2821,9 @@ start_decl (declarator, declspecs, initi
     switch (TREE_CODE (decl))
       {
       case TYPE_DECL:
-	/* typedef foo = bar  means give foo the same type as bar.
-	   We haven't parsed bar yet, so `finish_decl' will fix that up.
-	   Any other case of an initialization in a TYPE_DECL is an error.  */
-	if (pedantic || list_length (declspecs) > 1)
-	  {
-	    error ("typedef `%s' is initialized",
-		   IDENTIFIER_POINTER (DECL_NAME (decl)));
-	    initialized = 0;
-	  }
+	error ("typedef `%s' is initialized",
+	       IDENTIFIER_POINTER (DECL_NAME (decl)));
+	initialized = 0;
 	break;
 
       case FUNCTION_DECL:
@@ -2988,16 +2982,7 @@ finish_decl (decl, init, asmspec_tree)
     init = 0;
 
   if (init)
-    {
-      if (TREE_CODE (decl) != TYPE_DECL)
-	store_init_value (decl, init);
-      else
-	{
-	  /* typedef foo = bar; store the type of bar as the type of foo.  */
-	  TREE_TYPE (decl) = TREE_TYPE (init);
-	  DECL_INITIAL (decl) = init = 0;
-	}
-    }
+    store_init_value (decl, init);
 
   /* Deduce size of array from initialization, if not already known */
   if (TREE_CODE (type) == ARRAY_TYPE
===================================================================
Index: cp/decl.c
--- cp/decl.c	2 Oct 2002 18:46:40 -0000	1.942
+++ cp/decl.c	9 Oct 2002 16:44:29 -0000
@@ -7290,14 +7290,8 @@ start_decl (declarator, declspecs, initi
     switch (TREE_CODE (decl))
       {
       case TYPE_DECL:
-	/* typedef foo = bar  means give foo the same type as bar.
-	   We haven't parsed bar yet, so `cp_finish_decl' will fix that up.
-	   Any other case of an initialization in a TYPE_DECL is an error.  */
-	if (pedantic || list_length (declspecs) > 1)
-	  {
-	    error ("typedef `%D' is initialized", decl);
-	    initialized = 0;
-	  }
+	error ("typedef `%D' is initialized", decl);
+	initialized = 0;
 	break;
 
       case FUNCTION_DECL:
@@ -8156,12 +8150,6 @@ cp_finish_decl (decl, init, asmspec_tree
   /* Take care of TYPE_DECLs up front.  */
   if (TREE_CODE (decl) == TYPE_DECL)
     {
-      if (init && DECL_INITIAL (decl))
-	{
-	  /* typedef foo = bar; store the type of bar as the type of foo.  */
-	  TREE_TYPE (decl) = type = TREE_TYPE (init);
-	  DECL_INITIAL (decl) = init = NULL_TREE;
-	}
       if (type != error_mark_node
 	  && IS_AGGR_TYPE (type) && DECL_NAME (decl))
 	{
@@ -11364,9 +11352,6 @@ grokdeclarator (declarator, declspecs, d
 
       bad_specifiers (decl, "type", virtualp, quals != NULL_TREE,
 		      inlinep, friendp, raises != NULL_TREE);
-
-      if (initialized)
-	error ("typedef declaration includes an initializer");
 
       return decl;
     }
===================================================================
Index: doc/extend.texi
--- doc/extend.texi	27 Sep 2002 13:30:07 -0000	1.104
+++ doc/extend.texi	9 Oct 2002 16:44:31 -0000
@@ -427,7 +427,6 @@ extensions, accepted by GCC in C89 mode 
 * Labels as Values::    Getting pointers to labels, and computed gotos.
 * Nested Functions::    As in Algol and Pascal, lexical scoping of functions.
 * Constructing Calls::	Dispatching a call to another function.
-* Naming Types::        Giving a name to the type of some expression.
 * Typeof::              @code{typeof}: referring to the type of an expression.
 * Lvalues::             Using @samp{?:}, @samp{,} and casts in lvalues.
 * Conditionals::        Omitting the middle operand of a @samp{?:} expression.
@@ -538,8 +537,7 @@ the value of an enumeration constant, th
 the initial value of a static variable.
 
 If you don't know the type of the operand, you can still do this, but you
-must use @code{typeof} (@pxref{Typeof}) or type naming (@pxref{Naming
-Types}).
+must use @code{typeof} (@pxref{Typeof}).
 
 Statement expressions are not supported fully in G++, and their fate
 there is unclear.  (It is possible that they will become fully supported
@@ -888,29 +886,6 @@ the containing function.  You should spe
 returned by @code{__builtin_apply}.
 @end deftypefn
 
-@node Naming Types
-@section Naming an Expression's Type
-@cindex naming types
-
-You can give a name to the type of an expression using a @code{typedef}
-declaration with an initializer.  Here is how to define @var{name} as a
-type name for the type of @var{exp}:
-
-@example
-typedef @var{name} = @var{exp};
-@end example
-
-This is useful in conjunction with the statements-within-expressions
-feature.  Here is how the two together can be used to define a safe
-``maximum'' macro that operates on any arithmetic type:
-
-@example
-#define max(a,b) \
-  (@{typedef _ta = (a), _tb = (b);  \
-    _ta _a = (a); _tb _b = (b);     \
-    _a > _b ? _a : _b; @})
-@end example
-
 @cindex underscores in variables in macros
 @cindex @samp{_} in variables in macros
 @cindex local variables in macros
@@ -962,6 +937,20 @@ A @code{typeof}-construct can be used an
 used.  For example, you can use it in a declaration, in a cast, or inside
 of @code{sizeof} or @code{typeof}.
 
+@code{typeof} is often useful in conjunction with the
+statements-within-expressions feature.  Here is how the two together can
+be used to define a safe ``maximum'' macro that operates on any
+arithmetic type and evaluates each of its arguments exactly once:
+
+@example
+#define max(a,b) \
+  (@{ typeof (a) _a = (a); \
+      typeof (b) _b = (b); \
+    _a > _b ? _a : _b; @})
+@end example
+
+Some more examples of the use of @code{typeof}:
+
 @itemize @bullet
 @item
 This declares @code{y} with the type of what @code{x} points to.
@@ -6827,12 +6816,12 @@ the minimum value of variables @var{i} a
 
 However, side effects in @code{X} or @code{Y} may cause unintended
 behavior.  For example, @code{MIN (i++, j++)} will fail, incrementing
-the smaller counter twice.  A GNU C extension allows you to write safe
-macros that avoid this kind of problem (@pxref{Naming Types,,Naming an
-Expression's Type}).  However, writing @code{MIN} and @code{MAX} as
-macros also forces you to use function-call notation for a
-fundamental arithmetic operation.  Using GNU C++ extensions, you can
-write @w{@samp{int min = i <? j;}} instead.
+the smaller counter twice.  The GNU C @code{typeof} extension allows you
+to write safe macros that avoid this kind of problem (@pxref{Typeof}).
+However, writing @code{MIN} and @code{MAX} as macros also forces you to
+use function-call notation for a fundamental arithmetic operation.
+Using GNU C++ extensions, you can write @w{@samp{int min = i <? j;}}
+instead.
 
 Since @code{<?} and @code{>?} are built into the compiler, they properly
 handle expressions with side-effects;  @w{@samp{int min = i++ <? j++;}}
===================================================================
Index: testsuite/g++.dg/ext/typedef-init.C
--- testsuite/g++.dg/ext/typedef-init.C	1 Jan 1970 00:00:00 -0000
+++ testsuite/g++.dg/ext/typedef-init.C	9 Oct 2002 16:44:31 -0000
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-fpermissive" } // suppress default -pedantic-errors */
+
+/* This code used to be a legitimate, if dubious, extension.  However,
+   it's been broken since GCC 3.0 (caused ICE) and we have now removed
+   the extension.  See PR c/7353.
+
+   C++ issues a warning in addition to the error, since this construct
+   appears to be a case of implicit int (forbidden in std. C++) until
+   we get to the equals sign.  */
+
+typedef A = 0;  /* { dg-error "initialized" "typedef A = B" } */
+                /* { dg-warning "no type" "also warns" { target *-*-* } 12 } */
+A a;            /* { dg-bogus "" "no error cascade" } */
===================================================================
Index: testsuite/gcc.dg/typedef-init.c
--- testsuite/gcc.dg/typedef-init.c	1 Jan 1970 00:00:00 -0000
+++ testsuite/gcc.dg/typedef-init.c	9 Oct 2002 16:44:32 -0000
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } // suppress default -pedantic-errors */
+
+/* This code used to be a legitimate, if dubious, extension.  However,
+   it's been broken since GCC 3.0 (caused ICE) and we have now removed
+   the extension.  See PR c/7353.  */
+
+typedef A = 0;  /* { dg-error "initialized" "typedef A = B" } */
+A a;            /* { dg-bogus "" "no error cascade" } */
===================================================================
Index: gcc-3.3/changes.html
--- gcc-3.3/changes.html	2 Oct 2002 17:40:48 -0000	1.8
+++ gcc-3.3/changes.html	9 Oct 2002 16:55:19 -0000
@@ -35,7 +35,17 @@
     <li>The DWARF (version 1) debugging format has been deprecated and 
         will be removed in a future version of GCC.  Version 2 of the 
 	DWARF debugging format will continue to be supported for the
-        forseeable future.</li>
+        foreseeable future.</li>
+
+    <li>The C and Objective C compilers no longer accept the "Naming
+        Types" extension (<code>typedef foo = bar</code>); it was
+        already unavailable in C++.  Code which uses it will need to
+        be changed to use the "typeof" extension instead:
+        <code>typedef typeof(bar) foo</code>.  (We have removed this
+        extension without a period of deprecation because it has
+        caused the compiler to crash since version 3.0 and no one
+        noticed until very recently.  Thus we conclude it is not in
+        widespread use.)</li>
   </ul>
 
 

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-09  9:55       ` Zack Weinberg
@ 2002-10-09 10:01         ` Mark Mitchell
  2002-10-09 11:22           ` Zack Weinberg
  0 siblings, 1 reply; 21+ messages in thread
From: Mark Mitchell @ 2002-10-09 10:01 UTC (permalink / raw)
  To: Zack Weinberg, Joseph S. Myers; +Cc: Richard Henderson, gcc-patches

> We should also do something on the 3.2 branch - thoughts?

Apply the same patch there, or as close as you can get.  The crash is
a regression, and it's better to tell people this no longer works than
to simply crash.

This is pretty cavalier treatement for a documented extension, but this
is a special case (the total breakage for a long time).

You might note that you can do:

  typedef typeof (0) T;

instead of:

  typedef T = 0;

in your docs somewhere.  That works in GNU C++ as well, by the way.

-- 
Mark Mitchell                mark@codesourcery.com
CodeSourcery, LLC            http://www.codesourcery.com

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-09  9:50       ` Mark Mitchell
@ 2002-10-09 10:01         ` Zack Weinberg
  0 siblings, 0 replies; 21+ messages in thread
From: Zack Weinberg @ 2002-10-09 10:01 UTC (permalink / raw)
  To: Mark Mitchell; +Cc: Joseph S. Myers, Richard Henderson, gcc-patches

On Wed, Oct 09, 2002 at 09:48:32AM -0700, Mark Mitchell wrote:
> --On Wednesday, October 09, 2002 09:09:06 AM +0100 "Joseph S. Myers" wrote:
> >You need testcases (C and C++) for removal of this feature and an entry in
> >the 3.3 release notes - but removing it now without a deprecation period
> >is OK by me (if the Release Manager approves it for this development
> >stage).
> 
> Go ahead and remove the extension, making the mods Joseph requests.

Oops, crossed wires.  I will go ahead and check in on the mainline,
the patch I just sent.  I'd still appreciate an opinion about what if
anything should be done for 3.2.1.

zw

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-09 10:01         ` Mark Mitchell
@ 2002-10-09 11:22           ` Zack Weinberg
  2002-10-09 11:33             ` Mark Mitchell
  2002-10-31 23:03             ` Jason Merrill
  0 siblings, 2 replies; 21+ messages in thread
From: Zack Weinberg @ 2002-10-09 11:22 UTC (permalink / raw)
  To: Mark Mitchell; +Cc: Joseph S. Myers, Richard Henderson, gcc-patches

On Wed, Oct 09, 2002 at 09:59:21AM -0700, Mark Mitchell wrote:
> >We should also do something on the 3.2 branch - thoughts?
> 
> Apply the same patch there, or as close as you can get.  The crash is
> a regression, and it's better to tell people this no longer works than
> to simply crash.

Okay.  The patch applies with no modifications to 3.2; I am running a
bootstrap now.  I'll check it in on both branches at the same time,
later today, and close the PR.

> You might note that you can do:
> 
>  typedef typeof (0) T;
> 
> instead of:
> 
>  typedef T = 0;
> 
> in your docs somewhere.  That works in GNU C++ as well, by the way.

Revised patch for doc/extend.texi follows.  This was already in the
release notes.

zw

===================================================================
Index: doc/extend.texi
--- doc/extend.texi	27 Sep 2002 13:30:07 -0000	1.104
+++ doc/extend.texi	9 Oct 2002 18:22:10 -0000
@@ -427,7 +427,6 @@ extensions, accepted by GCC in C89 mode 
 * Labels as Values::    Getting pointers to labels, and computed gotos.
 * Nested Functions::    As in Algol and Pascal, lexical scoping of functions.
 * Constructing Calls::	Dispatching a call to another function.
-* Naming Types::        Giving a name to the type of some expression.
 * Typeof::              @code{typeof}: referring to the type of an expression.
 * Lvalues::             Using @samp{?:}, @samp{,} and casts in lvalues.
 * Conditionals::        Omitting the middle operand of a @samp{?:} expression.
@@ -538,8 +537,7 @@ the value of an enumeration constant, th
 the initial value of a static variable.
 
 If you don't know the type of the operand, you can still do this, but you
-must use @code{typeof} (@pxref{Typeof}) or type naming (@pxref{Naming
-Types}).
+must use @code{typeof} (@pxref{Typeof}).
 
 Statement expressions are not supported fully in G++, and their fate
 there is unclear.  (It is possible that they will become fully supported
@@ -888,29 +886,6 @@ the containing function.  You should spe
 returned by @code{__builtin_apply}.
 @end deftypefn
 
-@node Naming Types
-@section Naming an Expression's Type
-@cindex naming types
-
-You can give a name to the type of an expression using a @code{typedef}
-declaration with an initializer.  Here is how to define @var{name} as a
-type name for the type of @var{exp}:
-
-@example
-typedef @var{name} = @var{exp};
-@end example
-
-This is useful in conjunction with the statements-within-expressions
-feature.  Here is how the two together can be used to define a safe
-``maximum'' macro that operates on any arithmetic type:
-
-@example
-#define max(a,b) \
-  (@{typedef _ta = (a), _tb = (b);  \
-    _ta _a = (a); _tb _b = (b);     \
-    _a > _b ? _a : _b; @})
-@end example
-
 @cindex underscores in variables in macros
 @cindex @samp{_} in variables in macros
 @cindex local variables in macros
@@ -962,6 +937,21 @@ A @code{typeof}-construct can be used an
 used.  For example, you can use it in a declaration, in a cast, or inside
 of @code{sizeof} or @code{typeof}.
 
+@code{typeof} is often useful in conjunction with the
+statements-within-expressions feature.  Here is how the two together can
+be used to define a safe ``maximum'' macro that operates on any
+arithmetic type and evaluates each of its arguments exactly once:
+
+@example
+#define max(a,b) \
+  (@{ typeof (a) _a = (a); \
+      typeof (b) _b = (b); \
+    _a > _b ? _a : _b; @})
+@end example
+
+@noindent
+Some more examples of the use of @code{typeof}:
+
 @itemize @bullet
 @item
 This declares @code{y} with the type of what @code{x} points to.
@@ -1011,6 +1001,26 @@ Thus, @code{array (pointer (char), 4)} i
 pointers to @code{char}.
 @end itemize
 
+@emph{Compatibility Note:} In addition to @code{typeof}, GCC 2 supported
+a more limited extension which permitted one to write
+
+@example
+typedef @var{T} = @var{expr};
+@end example
+
+@noindent
+with the effect of declaring @var{T} to have the type of the expression
+@var{expr}.  This extension does not work with GCC 3 (versions between
+3.0 and 3.2 will crash; 3.2.1 and later give an error).  Code which
+relies on it should be rewritten to use @code{typeof}:
+
+@example
+typedef typeof(@var{expr}) @var{T};
+@end example
+
+@noindent
+This will work with all versions of GCC@.
+
 @node Lvalues
 @section Generalized Lvalues
 @cindex compound expressions as lvalues
@@ -6827,12 +6837,12 @@ the minimum value of variables @var{i} a
 
 However, side effects in @code{X} or @code{Y} may cause unintended
 behavior.  For example, @code{MIN (i++, j++)} will fail, incrementing
-the smaller counter twice.  A GNU C extension allows you to write safe
-macros that avoid this kind of problem (@pxref{Naming Types,,Naming an
-Expression's Type}).  However, writing @code{MIN} and @code{MAX} as
-macros also forces you to use function-call notation for a
-fundamental arithmetic operation.  Using GNU C++ extensions, you can
-write @w{@samp{int min = i <? j;}} instead.
+the smaller counter twice.  The GNU C @code{typeof} extension allows you
+to write safe macros that avoid this kind of problem (@pxref{Typeof}).
+However, writing @code{MIN} and @code{MAX} as macros also forces you to
+use function-call notation for a fundamental arithmetic operation.
+Using GNU C++ extensions, you can write @w{@samp{int min = i <? j;}}
+instead.
 
 Since @code{<?} and @code{>?} are built into the compiler, they properly
 handle expressions with side-effects;  @w{@samp{int min = i++ <? j++;}}

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-07 23:12   ` Neil Booth
  2002-10-08 18:33     ` Phil Edwards
@ 2002-10-09 11:30     ` Mike Stump
  1 sibling, 0 replies; 21+ messages in thread
From: Mike Stump @ 2002-10-09 11:30 UTC (permalink / raw)
  To: Neil Booth; +Cc: Richard Henderson, Zack Weinberg, gcc-patches

On Monday, October 7, 2002, at 11:11 PM, Neil Booth wrote:
> Richard Henderson wrote:-
>
>>> produces an ICE with all versions of GCC since 3.0.  This is an
>>> obscure, rarely-used extension, but if we're going to have it, it
>>> should work.
>>
>> I'm for nuking it myself.
>
> I concur.  It's really ugly.

I know about typeof, but never knew about this one, I'd vote for nuking 
it, maybe give an error message that explain the way to write it 
instead.
If the C++ world, it would be -fpermissive, though, I don't think C has 
this flag.  We could add it back in a . release, if a lot of important 
people complain (I'm betting they won't).

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-09 11:22           ` Zack Weinberg
@ 2002-10-09 11:33             ` Mark Mitchell
  2002-10-31 23:03             ` Jason Merrill
  1 sibling, 0 replies; 21+ messages in thread
From: Mark Mitchell @ 2002-10-09 11:33 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: Joseph S. Myers, Richard Henderson, gcc-patches



--On Wednesday, October 09, 2002 11:22:14 AM -0700 Zack Weinberg 
<zack@codesourcery.com> wrote:

> On Wed, Oct 09, 2002 at 09:59:21AM -0700, Mark Mitchell wrote:
>> > We should also do something on the 3.2 branch - thoughts?
>>
>> Apply the same patch there, or as close as you can get.  The crash is
>> a regression, and it's better to tell people this no longer works than
>> to simply crash.
>
> Okay.  The patch applies with no modifications to 3.2; I am running a
> bootstrap now.  I'll check it in on both branches at the same time,
> later today, and close the PR.

Cool-o.

Thanks,

-- 
Mark Mitchell                mark@codesourcery.com
CodeSourcery, LLC            http://www.codesourcery.com

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-09 11:22           ` Zack Weinberg
  2002-10-09 11:33             ` Mark Mitchell
@ 2002-10-31 23:03             ` Jason Merrill
  2002-11-01  9:45               ` Zack Weinberg
  1 sibling, 1 reply; 21+ messages in thread
From: Jason Merrill @ 2002-10-31 23:03 UTC (permalink / raw)
  To: Zack Weinberg
  Cc: Mark Mitchell, Joseph S. Myers, Richard Henderson, gcc-patches

This patch causes us to no longer give an error for

  struct A {
    typedef int B = 0;
  };

this is a regression.

Jason

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-10-31 23:03             ` Jason Merrill
@ 2002-11-01  9:45               ` Zack Weinberg
  2002-11-01 10:38                 ` Jason Merrill
  0 siblings, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2002-11-01  9:45 UTC (permalink / raw)
  To: Jason Merrill
  Cc: Mark Mitchell, Joseph S. Myers, Richard Henderson, gcc-patches

On Fri, Nov 01, 2002 at 01:55:48AM -0500, Jason Merrill wrote:
> This patch causes us to no longer give an error for
> 
>   struct A {
>     typedef int B = 0;
>   };

Huh?

$ ./cc1 -quiet test.c
test.c:2: error: parse error before "typedef"
test.c:2: warning: no semicolon at end of struct or union

$ ./cc1plus -quiet test.c
test.c:2: error: ISO C++ forbids declaration of `B' with no type

Not the *best* diagnostics, but I don't feel it's worth trying to get
good diagnostics out of the old parser.

zw

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-11-01  9:45               ` Zack Weinberg
@ 2002-11-01 10:38                 ` Jason Merrill
  2002-11-01 10:47                   ` Paolo Carlini
  2002-11-01 11:50                   ` Zack Weinberg
  0 siblings, 2 replies; 21+ messages in thread
From: Jason Merrill @ 2002-11-01 10:38 UTC (permalink / raw)
  To: Zack Weinberg
  Cc: Mark Mitchell, Joseph S. Myers, Richard Henderson, gcc-patches

On Fri, 1 Nov 2002 09:45:18 -0800, Zack Weinberg <zack@codesourcery.com> wrote:

> On Fri, Nov 01, 2002 at 01:55:48AM -0500, Jason Merrill wrote:
>> This patch causes us to no longer give an error for
>> 
>>   struct A {
>>     typedef int B = 0;
>>   };

> Huh?
>
> $ ./cc1plus -quiet test.c
> test.c:2: error: ISO C++ forbids declaration of `B' with no type

I don't get this error.  It does say 'int', after all...

Jason

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-11-01 10:38                 ` Jason Merrill
@ 2002-11-01 10:47                   ` Paolo Carlini
  2002-11-01 11:50                   ` Zack Weinberg
  1 sibling, 0 replies; 21+ messages in thread
From: Paolo Carlini @ 2002-11-01 10:47 UTC (permalink / raw)
  To: Jason Merrill
  Cc: Zack Weinberg, Mark Mitchell, Joseph S. Myers, Richard Henderson,
	gcc-patches

Jason Merrill wrote:

>>$ ./cc1plus -quiet test.c
>>test.c:2: error: ISO C++ forbids declaration of `B' with no type
>>    
>>
>I don't get this error.  It does say 'int', after all...
>
Neither I, with a compiler built from sources checked out minutes ago.

Ciao, Paolo.




^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-11-01 10:38                 ` Jason Merrill
  2002-11-01 10:47                   ` Paolo Carlini
@ 2002-11-01 11:50                   ` Zack Weinberg
  2002-11-01 12:05                     ` Mark Mitchell
  1 sibling, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2002-11-01 11:50 UTC (permalink / raw)
  To: Jason Merrill
  Cc: Mark Mitchell, Joseph S. Myers, Richard Henderson, gcc-patches

On Fri, Nov 01, 2002 at 01:38:29PM -0500, Jason Merrill wrote:
> On Fri, 1 Nov 2002 09:45:18 -0800, Zack Weinberg <zack@codesourcery.com> wrote:
> 
> > On Fri, Nov 01, 2002 at 01:55:48AM -0500, Jason Merrill wrote:
> >> This patch causes us to no longer give an error for
> >> 
> >>   struct A {
> >>     typedef int B = 0;
> >>   };
> 
> > Huh?
> >
> > $ ./cc1plus -quiet test.c
> > test.c:2: error: ISO C++ forbids declaration of `B' with no type
> 
> I don't get this error.  It does say 'int', after all...

Oof, sorry, I skimmed right past the 'int' when I retyped the test
case.

In the C++ front end, field declarations don't go through start_decl
so they get missed.  This isn't a problem in C because you can't put
a typedef inside an aggregate at all, in that language.

I'm testing this patch for the bug.

zw

cp:
	PR c/7353 redux
	* decl2.c (grokfield): Reject TYPE_DECLs with initializers.

testsuite:
	* g++.dg/ext/typedef-init.C, gcc.dg/typedef-init.C:
	Add some more cases.

===================================================================
Index: cp/decl2.c
--- cp/decl2.c	31 Oct 2002 16:07:31 -0000	1.569
+++ cp/decl2.c	1 Nov 2002 19:46:35 -0000
@@ -915,7 +915,13 @@ grokfield (declarator, declspecs, init, 
     /* friend or constructor went bad.  */
     return value;
   if (TREE_TYPE (value) == error_mark_node)
-    return error_mark_node;  
+    return error_mark_node;
+
+  if (TREE_CODE (value) == TYPE_DECL && init)
+    {
+      error ("typedef `%D' is initialized (use __typeof__ instead)", value);
+      init = NULL_TREE;
+    }
 
   /* Pass friendly classes back.  */
   if (TREE_CODE (value) == VOID_TYPE)
===================================================================
Index: testsuite/g++.dg/ext/typedef-init.C
--- testsuite/g++.dg/ext/typedef-init.C	9 Oct 2002 21:27:38 -0000	1.1
+++ testsuite/g++.dg/ext/typedef-init.C	1 Nov 2002 19:46:36 -0000
@@ -5,10 +5,29 @@
    it's been broken since GCC 3.0 (caused ICE) and we have now removed
    the extension.  See PR c/7353.
 
-   C++ issues a warning in addition to the error, since this construct
-   appears to be a case of implicit int (forbidden in std. C++) until
-   we get to the equals sign.  */
-
-typedef A = 0;  /* { dg-error "initialized" "typedef A = B" } */
-                /* { dg-warning "no type" "also warns" { target *-*-* } 12 } */
-A a;            /* { dg-bogus "" "no error cascade" } */
+   For cases A and C, C++ issues a warning in addition to the error,
+   since this construct appears to be a case of implicit int
+   (forbidden in std. C++) until we get to the equals sign.  */
+
+/* Case A: just the bare name = initializer.  */
+
+typedef A = 0;  /* { dg-error "initialized" "A" } */
+                /* { dg-warning "no type" "A warns" { target *-*-* } 14 } */
+A a;            /* { dg-bogus "" "A error cascade" } */
+
+/* Case B: with a type also.  */
+
+typedef int B = 0;  /* { dg-error "initialized" "B" } */
+B b;		    /* { dg-bogus "" "B error cascade" } */
+
+/* C and D are the same as A and B, but wrapped in a structure;
+   field declarations go by a different code path in C++ (ick).  */
+
+struct S {
+  typedef C = 0; /* { dg-error "initialized" "C" } */
+                 /* { dg-warning "no type" "C warns" { target *-*-* } 27 } */
+  C c;		 /* { dg-bogus "" "C error cascade" } */
+
+  typedef int D = 0; /* { dg-error "initialized" "D" } */
+  D d;		     /* { dg-bogus "" "D error cascade" } */
+};
===================================================================
Index: testsuite/gcc.dg/typedef-init.c
--- testsuite/gcc.dg/typedef-init.c	9 Oct 2002 21:27:38 -0000	1.1
+++ testsuite/gcc.dg/typedef-init.c	1 Nov 2002 19:46:37 -0000
@@ -5,5 +5,12 @@
    it's been broken since GCC 3.0 (caused ICE) and we have now removed
    the extension.  See PR c/7353.  */
 
-typedef A = 0;  /* { dg-error "initialized" "typedef A = B" } */
-A a;            /* { dg-bogus "" "no error cascade" } */
+/* Case A: just the bare name = initializer.  */
+
+typedef A = 0;  /* { dg-error "initialized" "A" } */
+A a;            /* { dg-bogus "" "A error cascade" } */
+
+/* Case B: with a type also.  */
+
+typedef int B = 0;  /* { dg-error "initialized" "B" } */
+B b;		    /* { dg-bogus "" "B error cascade" } */

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: Candidate fix for PR c/7353
  2002-11-01 11:50                   ` Zack Weinberg
@ 2002-11-01 12:05                     ` Mark Mitchell
  0 siblings, 0 replies; 21+ messages in thread
From: Mark Mitchell @ 2002-11-01 12:05 UTC (permalink / raw)
  To: Zack Weinberg, Jason Merrill
  Cc: Joseph S. Myers, Richard Henderson, gcc-patches

> I'm testing this patch for the bug.

The patch is fine when you're done testing.

-- 
Mark Mitchell                mark@codesourcery.com
CodeSourcery, LLC            http://www.codesourcery.com

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2002-11-01 20:05 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-07 16:52 Candidate fix for PR c/7353 Zack Weinberg
2002-10-07 22:59 ` Richard Henderson
2002-10-07 23:12   ` Neil Booth
2002-10-08 18:33     ` Phil Edwards
2002-10-09 11:30     ` Mike Stump
2002-10-07 23:57   ` Zack Weinberg
2002-10-08  2:58     ` Michael Matz
2002-10-08 11:04     ` Richard Henderson
2002-10-09  1:09     ` Joseph S. Myers
2002-10-09  9:50       ` Mark Mitchell
2002-10-09 10:01         ` Zack Weinberg
2002-10-09  9:55       ` Zack Weinberg
2002-10-09 10:01         ` Mark Mitchell
2002-10-09 11:22           ` Zack Weinberg
2002-10-09 11:33             ` Mark Mitchell
2002-10-31 23:03             ` Jason Merrill
2002-11-01  9:45               ` Zack Weinberg
2002-11-01 10:38                 ` Jason Merrill
2002-11-01 10:47                   ` Paolo Carlini
2002-11-01 11:50                   ` Zack Weinberg
2002-11-01 12:05                     ` Mark Mitchell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).