1  /* Test for multiple declarations and composite types.  As in bug
       2     13801.  Test no problems in debug information generation.  */
       3  /* Origin: Joseph Myers <jsm@polyomino.org.uk> */
       4  /* { dg-do compile } */
       5  /* { dg-options "" } */
       6  
       7  typedef int IA[];
       8  typedef int A10[10];
       9  
      10  /* Test all combinations of: a variable declared at file scope (no
      11     type specifiers, or extern, or static), or just inside a function
      12     (with extern), redeclared in an inner scope (with extern), and
      13     redeclared in an inner scope when the previous declaration is
      14     hidden (with extern, and not if the original declaration was
      15     static).  Test three times: incomplete variable types; pointers to
      16     incomplete types; functions returning such pointers.
      17  
      18     This test only includes the valid code cases, to test debug info
      19     generation.  (Incomplete static at file scope is not permitted by
      20     ISO C, but is accepted by GCC as an extension without
      21     -pedantic.)  */
      22  
      23  A10 a5;
      24  void
      25  f5 (void)
      26  {
      27    sizeof(a5);
      28    {
      29      extern IA a5;
      30      sizeof(a5);
      31      {
      32        int a5;
      33        {
      34          extern A10 a5;
      35          sizeof(a5);
      36        }
      37      }
      38      sizeof(a5);
      39    }
      40    sizeof(a5);
      41  }
      42  extern A10 a5;
      43  
      44  A10 a7;
      45  void
      46  f7 (void)
      47  {
      48    sizeof(a7);
      49    {
      50      extern A10 a7;
      51      sizeof(a7);
      52      {
      53        int a7;
      54        {
      55          extern A10 a7;
      56          sizeof(a7);
      57        }
      58      }
      59      sizeof(a7);
      60    }
      61    sizeof(a7);
      62  }
      63  extern A10 a7;
      64  
      65  extern A10 a13;
      66  void
      67  f13 (void)
      68  {
      69    sizeof(a13);
      70    {
      71      extern IA a13;
      72      sizeof(a13);
      73      {
      74        int a13;
      75        {
      76          extern A10 a13;
      77          sizeof(a13);
      78        }
      79      }
      80      sizeof(a13);
      81    }
      82    sizeof(a13);
      83  }
      84  extern A10 a13;
      85  
      86  extern A10 a15;
      87  void
      88  f15 (void)
      89  {
      90    sizeof(a15);
      91    {
      92      extern A10 a15;
      93      sizeof(a15);
      94      {
      95        int a15;
      96        {
      97          extern A10 a15;
      98          sizeof(a15);
      99        }
     100      }
     101      sizeof(a15);
     102    }
     103    sizeof(a15);
     104  }
     105  extern A10 a15;
     106  
     107  
     108  static A10 a18;
     109  void
     110  f18 (void)
     111  {
     112    sizeof(a18);
     113    {
     114      extern IA a18;
     115      sizeof(a18);
     116    }
     117    sizeof(a18);
     118  }
     119  extern A10 a18;
     120  
     121  static A10 a19;
     122  void
     123  f19 (void)
     124  {
     125    sizeof(a19);
     126    {
     127      extern A10 a19;
     128      sizeof(a19);
     129    }
     130    sizeof(a19);
     131  }
     132  extern A10 a19;
     133  
     134  A10 *b5;
     135  void
     136  g5 (void)
     137  {
     138    sizeof(*b5);
     139    {
     140      extern IA *b5;
     141      sizeof(*b5);
     142      {
     143        int b5;
     144        {
     145          extern A10 *b5;
     146          sizeof(*b5);
     147        }
     148      }
     149      sizeof(*b5);
     150    }
     151    sizeof(*b5);
     152  }
     153  extern A10 *b5;
     154  
     155  A10 *b7;
     156  void
     157  g7 (void)
     158  {
     159    sizeof(*b7);
     160    {
     161      extern A10 *b7;
     162      sizeof(*b7);
     163      {
     164        int b7;
     165        {
     166          extern A10 *b7;
     167          sizeof(*b7);
     168        }
     169      }
     170      sizeof(*b7);
     171    }
     172    sizeof(*b7);
     173  }
     174  extern A10 *b7;
     175  
     176  extern A10 *b13;
     177  void
     178  g13 (void)
     179  {
     180    sizeof(*b13);
     181    {
     182      extern IA *b13;
     183      sizeof(*b13);
     184      {
     185        int b13;
     186        {
     187          extern A10 *b13;
     188          sizeof(*b13);
     189        }
     190      }
     191      sizeof(*b13);
     192    }
     193    sizeof(*b13);
     194  }
     195  extern A10 *b13;
     196  
     197  extern A10 *b15;
     198  void
     199  g15 (void)
     200  {
     201    sizeof(*b15);
     202    {
     203      extern A10 *b15;
     204      sizeof(*b15);
     205      {
     206        int b15;
     207        {
     208          extern A10 *b15;
     209          sizeof(*b15);
     210        }
     211      }
     212      sizeof(*b15);
     213    }
     214    sizeof(*b15);
     215  }
     216  extern A10 *b15;
     217  
     218  static A10 *b18;
     219  void
     220  g18 (void)
     221  {
     222    sizeof(*b18);
     223    {
     224      extern IA *b18;
     225      sizeof(*b18);
     226    }
     227    sizeof(*b18);
     228  }
     229  extern A10 *b18;
     230  
     231  static A10 *b19;
     232  void
     233  g19 (void)
     234  {
     235    sizeof(*b19);
     236    {
     237      extern A10 *b19;
     238      sizeof(*b19);
     239    }
     240    sizeof(*b19);
     241  }
     242  extern A10 *b19;
     243  
     244  A10 *c5 (void);
     245  void
     246  h5 (void)
     247  {
     248    sizeof(*c5());
     249    {
     250      extern IA *c5 (void);
     251      sizeof(*c5());
     252      {
     253        int c5;
     254        {
     255          extern A10 *c5 (void);
     256          sizeof(*c5());
     257        }
     258      }
     259      sizeof(*c5());
     260    }
     261    sizeof(*c5());
     262  }
     263  A10 *c5 (void) { return 0; }
     264  
     265  A10 *c7 (void);
     266  void
     267  h7 (void)
     268  {
     269    sizeof(*c7());
     270    {
     271      extern A10 *c7 (void);
     272      sizeof(*c7());
     273      {
     274        int c7;
     275        {
     276          extern A10 *c7 (void);
     277          sizeof(*c7());
     278        }
     279      }
     280      sizeof(*c7());
     281    }
     282    sizeof(*c7());
     283  }
     284  A10 *c7 (void) { return 0; }
     285  
     286  extern A10 *c13 (void);
     287  void
     288  h13 (void)
     289  {
     290    sizeof(*c13());
     291    {
     292      extern IA *c13 (void);
     293      sizeof(*c13());
     294      {
     295        int c13;
     296        {
     297          extern A10 *c13 (void);
     298          sizeof(*c13());
     299        }
     300      }
     301      sizeof(*c13());
     302    }
     303    sizeof(*c13());
     304  }
     305  extern A10 *c13 (void) { return 0; }
     306  
     307  extern A10 *c15 (void);
     308  void
     309  h15 (void)
     310  {
     311    sizeof(*c15());
     312    {
     313      extern A10 *c15 (void);
     314      sizeof(*c15());
     315      {
     316        int c15;
     317        {
     318          extern A10 *c15 (void);
     319          sizeof(*c15());
     320        }
     321      }
     322      sizeof(*c15());
     323    }
     324    sizeof(*c15());
     325  }
     326  extern A10 *c15 (void) { return 0; }
     327  
     328  static A10 *c18 (void);
     329  void
     330  h18 (void)
     331  {
     332    sizeof(*c18());
     333    {
     334      extern IA *c18 (void);
     335      sizeof(*c18());
     336    }
     337    sizeof(*c18());
     338  }
     339  static A10 *c18 (void) { return 0; }
     340  
     341  static A10 *c19 (void);
     342  void
     343  h19 (void)
     344  {
     345    sizeof(*c19());
     346    {
     347      extern A10 *c19 (void);
     348      sizeof(*c19());
     349    }
     350    sizeof(*c19());
     351  }
     352  static A10 *c19 (void) { return 0; }