diff mbox

Disallow redefinition of variably modified typedefs

Message ID Pine.LNX.4.64.1103182326350.4243@digraph.polyomino.org.uk
State New
Headers show

Commit Message

Joseph Myers March 18, 2011, 11:29 p.m. UTC
This week's London WG14 meeting decided that typedef redefinition
should not be allowed in the case of variably modified types.  This
patch implements this, giving an error for such redefinitions.

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  Applied
to mainline.  Any comments from other RMs about whether this should go
in 4.6 as well, to avoid 4.6.0 being more lenient in this area than
both 4.5 and 4.7?  This is much the same issue as for anonymous
structs and unions, but for a much more obscure case.

(These two patches cover the only two cases of C1X features that were
fully implemented for 4.6 according to the pre-London draft, and then
changed in London.  The post-London document will be going to
enquiry-stage ITTF/JTC1 ballot so if that passes there should be no
more technical changes before publication.)

2011-03-18  Joseph Myers  <joseph@codesourcery.com>

	* c-decl.c (diagnose_mismatched_decls): Give an error for
	redefining a typedef with variably modified type.

testsuite:
2011-03-18  Joseph Myers  <joseph@codesourcery.com>

	* gcc.dg/c1x-typedef-1.c: Expect errors for redefinitions of
	variably modified typedefs.
	* gcc.dg/c1x-typedef-2.c: Remove.

Comments

Richard Biener March 19, 2011, 12:20 p.m. UTC | #1
On Sat, Mar 19, 2011 at 12:29 AM, Joseph S. Myers
<joseph@codesourcery.com> wrote:
> This week's London WG14 meeting decided that typedef redefinition
> should not be allowed in the case of variably modified types.  This
> patch implements this, giving an error for such redefinitions.
>
> Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  Applied
> to mainline.  Any comments from other RMs about whether this should go
> in 4.6 as well, to avoid 4.6.0 being more lenient in this area than
> both 4.5 and 4.7?  This is much the same issue as for anonymous
> structs and unions, but for a much more obscure case.
>
> (These two patches cover the only two cases of C1X features that were
> fully implemented for 4.6 according to the pre-London draft, and then
> changed in London.  The post-London document will be going to
> enquiry-stage ITTF/JTC1 ballot so if that passes there should be no
> more technical changes before publication.)

I think it should go into 4.6.0 as well.

Thanks,
Richard.

> 2011-03-18  Joseph Myers  <joseph@codesourcery.com>
>
>        * c-decl.c (diagnose_mismatched_decls): Give an error for
>        redefining a typedef with variably modified type.
>
> testsuite:
> 2011-03-18  Joseph Myers  <joseph@codesourcery.com>
>
>        * gcc.dg/c1x-typedef-1.c: Expect errors for redefinitions of
>        variably modified typedefs.
>        * gcc.dg/c1x-typedef-2.c: Remove.
>
> Index: testsuite/gcc.dg/c1x-typedef-1.c
> ===================================================================
> --- testsuite/gcc.dg/c1x-typedef-1.c    (revision 171110)
> +++ testsuite/gcc.dg/c1x-typedef-1.c    (working copy)
> @@ -3,7 +3,8 @@
>  /* { dg-options "-std=c1x -pedantic-errors" } */
>
>  /* C1X permits typedefs to be redeclared to the same type, but not to
> -   different-but-compatible types.  */
> +   different-but-compatible types, and not when the type is variably
> +   modified.  */
>
>  #include <limits.h>
>
> @@ -60,9 +61,10 @@ f (void)
>   typedef void FN2(int (*p)[*]); /* { dg-message "previous declaration" } */
>   typedef void FN2(int (*p)[]); /* { dg-error "with different type" } */
>   typedef int AV[a]; /* { dg-message "previous declaration" } */
> -  typedef int AV[b-1]; /* { dg-warning "may be a constraint violation at runtime" } */
> -  typedef int AAa[a];
> +  typedef int AV[b-1]; /* { dg-error "redefinition" } */
> +  typedef int AAa[a]; /* { dg-message "previous declaration" } */
>   typedef int AAb[b-1];
>   typedef AAa *VF(void); /* { dg-message "previous declaration" } */
> -  typedef AAb *VF(void); /* { dg-warning "may be a constraint violation at runtime" } */
> +  typedef AAb *VF(void); /* { dg-error "redefinition" } */
> +  typedef AAa AAa; /* { dg-error "redefinition" } */
>  }
> Index: testsuite/gcc.dg/c1x-typedef-2.c
> ===================================================================
> --- testsuite/gcc.dg/c1x-typedef-2.c    (revision 171110)
> +++ testsuite/gcc.dg/c1x-typedef-2.c    (working copy)
> @@ -1,18 +0,0 @@
> -/* Test typedef redeclaration in C1X.  Side effects from duplicate
> -   declarations still apply.  */
> -/* { dg-do run } */
> -/* { dg-options "-std=c1x -pedantic-errors" } */
> -
> -extern void exit (int);
> -extern void abort (void);
> -
> -int
> -main (void)
> -{
> -  int a = 1, b = 1;
> -  typedef int T[++a]; /* { dg-message "previous declaration" } */
> -  typedef int T[++b]; /* { dg-warning "may be a constraint violation at runtime" } */
> -  if (a != 2 || b != 2)
> -    abort ();
> -  exit (0);
> -}
> Index: c-decl.c
> ===================================================================
> --- c-decl.c    (revision 171110)
> +++ c-decl.c    (working copy)
> @@ -1813,20 +1813,16 @@ diagnose_mismatched_decls (tree newdecl,
>          || TREE_NO_WARNING (olddecl))
>        return true;  /* Allow OLDDECL to continue in use.  */
>
> -      if (pedantic && !flag_isoc1x)
> +      if (variably_modified_type_p (newtype, NULL))
>        {
> -         pedwarn (input_location, OPT_pedantic,
> -                  "redefinition of typedef %q+D", newdecl);
> +         error ("redefinition of typedef %q+D with variably modified type",
> +                newdecl);
>          locate_old_decl (olddecl);
>        }
> -      else if (variably_modified_type_p (newtype, NULL))
> +      else if (pedantic && !flag_isoc1x)
>        {
> -         /* Whether there is a constraint violation for the types not
> -            being the same cannot be determined at compile time; a
> -            warning that there may be one at runtime is considered
> -            appropriate (WG14 reflector message 11743, 8 May 2009).  */
> -         warning (0, "redefinition of typedef %q+D may be a constraint "
> -                  "violation at runtime", newdecl);
> +         pedwarn (input_location, OPT_pedantic,
> +                  "redefinition of typedef %q+D", newdecl);
>          locate_old_decl (olddecl);
>        }
>
>
> --
> Joseph S. Myers
> joseph@codesourcery.com
>
Jakub Jelinek March 19, 2011, 12:27 p.m. UTC | #2
On Sat, Mar 19, 2011 at 01:20:41PM +0100, Richard Guenther wrote:
> On Sat, Mar 19, 2011 at 12:29 AM, Joseph S. Myers
> <joseph@codesourcery.com> wrote:
> > This week's London WG14 meeting decided that typedef redefinition
> > should not be allowed in the case of variably modified types.  This
> > patch implements this, giving an error for such redefinitions.
> >
> > Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  Applied
> > to mainline.  Any comments from other RMs about whether this should go
> > in 4.6 as well, to avoid 4.6.0 being more lenient in this area than
> > both 4.5 and 4.7?  This is much the same issue as for anonymous
> > structs and unions, but for a much more obscure case.
> >
> > (These two patches cover the only two cases of C1X features that were
> > fully implemented for 4.6 according to the pre-London draft, and then
> > changed in London.  The post-London document will be going to
> > enquiry-stage ITTF/JTC1 ballot so if that passes there should be no
> > more technical changes before publication.)
> 
> I think it should go into 4.6.0 as well.

Seconded.

	Jakub
diff mbox

Patch

Index: testsuite/gcc.dg/c1x-typedef-1.c
===================================================================
--- testsuite/gcc.dg/c1x-typedef-1.c	(revision 171110)
+++ testsuite/gcc.dg/c1x-typedef-1.c	(working copy)
@@ -3,7 +3,8 @@ 
 /* { dg-options "-std=c1x -pedantic-errors" } */
 
 /* C1X permits typedefs to be redeclared to the same type, but not to
-   different-but-compatible types.  */
+   different-but-compatible types, and not when the type is variably
+   modified.  */
 
 #include <limits.h>
 
@@ -60,9 +61,10 @@  f (void)
   typedef void FN2(int (*p)[*]); /* { dg-message "previous declaration" } */
   typedef void FN2(int (*p)[]); /* { dg-error "with different type" } */
   typedef int AV[a]; /* { dg-message "previous declaration" } */
-  typedef int AV[b-1]; /* { dg-warning "may be a constraint violation at runtime" } */
-  typedef int AAa[a];
+  typedef int AV[b-1]; /* { dg-error "redefinition" } */
+  typedef int AAa[a]; /* { dg-message "previous declaration" } */
   typedef int AAb[b-1];
   typedef AAa *VF(void); /* { dg-message "previous declaration" } */
-  typedef AAb *VF(void); /* { dg-warning "may be a constraint violation at runtime" } */
+  typedef AAb *VF(void); /* { dg-error "redefinition" } */
+  typedef AAa AAa; /* { dg-error "redefinition" } */
 }
Index: testsuite/gcc.dg/c1x-typedef-2.c
===================================================================
--- testsuite/gcc.dg/c1x-typedef-2.c	(revision 171110)
+++ testsuite/gcc.dg/c1x-typedef-2.c	(working copy)
@@ -1,18 +0,0 @@ 
-/* Test typedef redeclaration in C1X.  Side effects from duplicate
-   declarations still apply.  */
-/* { dg-do run } */
-/* { dg-options "-std=c1x -pedantic-errors" } */
-
-extern void exit (int);
-extern void abort (void);
-
-int
-main (void)
-{
-  int a = 1, b = 1;
-  typedef int T[++a]; /* { dg-message "previous declaration" } */
-  typedef int T[++b]; /* { dg-warning "may be a constraint violation at runtime" } */
-  if (a != 2 || b != 2)
-    abort ();
-  exit (0);
-}
Index: c-decl.c
===================================================================
--- c-decl.c	(revision 171110)
+++ c-decl.c	(working copy)
@@ -1813,20 +1813,16 @@  diagnose_mismatched_decls (tree newdecl,
 	  || TREE_NO_WARNING (olddecl))
 	return true;  /* Allow OLDDECL to continue in use.  */
 
-      if (pedantic && !flag_isoc1x)
+      if (variably_modified_type_p (newtype, NULL))
 	{
-	  pedwarn (input_location, OPT_pedantic,
-		   "redefinition of typedef %q+D", newdecl);
+	  error ("redefinition of typedef %q+D with variably modified type",
+		 newdecl);
 	  locate_old_decl (olddecl);
 	}
-      else if (variably_modified_type_p (newtype, NULL))
+      else if (pedantic && !flag_isoc1x)
 	{
-	  /* Whether there is a constraint violation for the types not
-	     being the same cannot be determined at compile time; a
-	     warning that there may be one at runtime is considered
-	     appropriate (WG14 reflector message 11743, 8 May 2009).  */
-	  warning (0, "redefinition of typedef %q+D may be a constraint "
-		   "violation at runtime", newdecl);
+	  pedwarn (input_location, OPT_pedantic,
+		   "redefinition of typedef %q+D", newdecl);
 	  locate_old_decl (olddecl);
 	}