1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 %s -verify -fsyntax-only -pedantic
265383479cb2caf0f136f58fecdbdbaf9c497b7a1Chris Lattner
365383479cb2caf0f136f58fecdbdbaf9c497b7a1Chris Lattnerint test1() {
465383479cb2caf0f136f58fecdbdbaf9c497b7a1Chris Lattner  typedef int x[test1()];  // vla
5d8803632d248a360a040ff03eff1162988058036Chris Lattner  static int y = sizeof(x);  // expected-error {{not a compile-time constant}}
665383479cb2caf0f136f58fecdbdbaf9c497b7a1Chris Lattner}
765383479cb2caf0f136f58fecdbdbaf9c497b7a1Chris Lattner
8b0c0554bd62689f48a1c42fc46c78c531cdb3cbfEli Friedman// PR2347
9b0c0554bd62689f48a1c42fc46c78c531cdb3cbfEli Friedmanvoid f (unsigned int m)
10b0c0554bd62689f48a1c42fc46c78c531cdb3cbfEli Friedman{
116b2564c5d968657a35025239ee681f288d83be41Eli Friedman  int e[2][m];
12b0c0554bd62689f48a1c42fc46c78c531cdb3cbfEli Friedman
13b0c0554bd62689f48a1c42fc46c78c531cdb3cbfEli Friedman  e[0][0] = 0;
14b0c0554bd62689f48a1c42fc46c78c531cdb3cbfEli Friedman}
15b0c0554bd62689f48a1c42fc46c78c531cdb3cbfEli Friedman
1667027a7bc35671bc3f6d5c109720060f06303391Chris Lattner// PR3048
170947b4e6c778ca94bbd0a56548de0b6b5ff1dfc9Chris Lattnerint x = sizeof(struct{char qq[x];}); // expected-error {{fields must have a constant size}}
1867027a7bc35671bc3f6d5c109720060f06303391Chris Lattner
1996e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson// PR2352
2096e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlssonvoid f2(unsigned int m)
2196e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson{
228f30105fda579f8e6db339cb88cdec2bef6350bdDouglas Gregor  extern int e1[2][m]; // expected-error {{variable length array declaration can not have 'extern' linkage}}
2396e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson
248f30105fda579f8e6db339cb88cdec2bef6350bdDouglas Gregor  e1[0][0] = 0;
2596e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson
2696e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson}
2796e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson
2896e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson// PR2361
2996e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlssonint i;
30211316faa26af4ce594a10bcfc204124fe363362Chris Lattnerint c[][i]; // expected-error {{variably modified type declaration not allowed at file scope}}
31211316faa26af4ce594a10bcfc204124fe363362Chris Lattnerint d[i]; // expected-error {{variable length array declaration not allowed at file scope}}
3296e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson
33211316faa26af4ce594a10bcfc204124fe363362Chris Lattnerint (*e)[i]; // expected-error {{variably modified type declaration not allowed at file scope}}
3496e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson
3596e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlssonvoid f3()
3696e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson{
3796e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson  static int a[i]; // expected-error {{variable length array declaration can not have 'static' storage duration}}
3896e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson  extern int b[i]; // expected-error {{variable length array declaration can not have 'extern' linkage}}
3996e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson
408f30105fda579f8e6db339cb88cdec2bef6350bdDouglas Gregor  extern int (*c1)[i]; // expected-error {{variably modified type declaration can not have 'extern' linkage}}
4196e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson  static int (*d)[i];
4296e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson}
4396e05bc09070aaa7c18d3dd3ff13125a43532f69Anders Carlsson
44bc592e6e56f16f5d06fc70c3931f7d9d33f7b3cdEli Friedman// PR3663
45e1eed38733ed47d44f9d8c7731817c411eaf4141Chris Lattnerstatic const unsigned array[((2 * (int)((((4) / 2) + 1.0/3.0) * (4) - 1e-8)) + 1)]; // expected-warning {{variable length array folded to constant array as an extension}}
46f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman
47f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedmanint a[*]; // expected-error {{star modifier used outside of function prototype}}
48f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedmanint f4(int a[*][*]);
4988f7b576dde22ca95b4c73c4fd463e2e799873a7Eli Friedman
5088f7b576dde22ca95b4c73c4fd463e2e799873a7Eli Friedman// PR2044
5188f7b576dde22ca95b4c73c4fd463e2e799873a7Eli Friedmanint pr2044(int b) {int (*c(void))[b];**c() = 2;} // expected-error {{variably modified type}}
5288f7b576dde22ca95b4c73c4fd463e2e799873a7Eli Friedmanint pr2044b;
5388f7b576dde22ca95b4c73c4fd463e2e799873a7Eli Friedmanint (*pr2044c(void))[pr2044b]; // expected-error {{variably modified type}}
544f54f4e2f1af5850805033d69c5199df068d11e7Mike Stump
554f54f4e2f1af5850805033d69c5199df068d11e7Mike Stumpconst int f5_ci = 1;
56e1eed38733ed47d44f9d8c7731817c411eaf4141Chris Lattnervoid f5() { char a[][f5_ci] = {""}; } // expected-warning {{variable length array folded to constant array as an extension}}
57d17e340e2d516139931768697bf080f60920ba9dSam Weinig
58d17e340e2d516139931768697bf080f60920ba9dSam Weinig// PR5185
59d17e340e2d516139931768697bf080f60920ba9dSam Weinigvoid pr5185(int a[*]);
60d17e340e2d516139931768697bf080f60920ba9dSam Weinigvoid pr5185(int a[*]) // expected-error {{variable length array must be bound in function definition}}
61d17e340e2d516139931768697bf080f60920ba9dSam Weinig{
62d17e340e2d516139931768697bf080f60920ba9dSam Weinig}
6356ff283a1f8e4e898568426f56e67a096efd1f80Eli Friedman
6456ff283a1f8e4e898568426f56e67a096efd1f80Eli Friedman// Make sure this isn't treated as an error
6556ff283a1f8e4e898568426f56e67a096efd1f80Eli Friedmanint TransformBug(int a) {
6656ff283a1f8e4e898568426f56e67a096efd1f80Eli Friedman return sizeof(*(int(*)[({ goto v; v: a;})]) 0); // expected-warning {{use of GNU statement expression extension}}
6756ff283a1f8e4e898568426f56e67a096efd1f80Eli Friedman}
68