@@ -53,8 +53,21 @@ class TestGarbage : public TestFixture {
5353 TEST_CASE (garbageCode10); // #6127
5454 TEST_CASE (garbageCode11);
5555 TEST_CASE (garbageCode12);
56-
57- TEST_CASE (astGarbage);
56+ TEST_CASE (garbageCode13); // Ticket #2607 - crash
57+ TEST_CASE (garbageCode14); // TIcket #5595 - crash
58+ TEST_CASE (garbageCode15); // Ticket #5203
59+ TEST_CASE (garbageCode16);
60+ TEST_CASE (garbageCode17);
61+ TEST_CASE (garbageCode18);
62+ TEST_CASE (garbageCode19);
63+ TEST_CASE (garbageCode20);
64+ TEST_CASE (garbageCode21);
65+ TEST_CASE (garbageCode22);
66+ TEST_CASE (garbageCode23);
67+
68+ TEST_CASE (garbageValueFlow);
69+ TEST_CASE (garbageSymbolDatabase);
70+ TEST_CASE (garbageAST);
5871 }
5972
6073 std::string checkCode (const char code[], const char filename[] = " test.cpp" ) {
@@ -258,7 +271,102 @@ class TestGarbage : public TestFixture {
258271 checkCode (" { g; S (void) { struct } { } int &g; }" );
259272 }
260273
261- void astGarbage () {
274+ void garbageCode13 () {
275+ checkCode (" struct C {} {} x" );
276+ }
277+
278+ void garbageCode14 () {
279+ checkCode (" static f() { int i; int source[1] = { 1 }; for (i = 0; i < 4; i++) (u, if (y u.x e)) }" ); // Garbage code
280+ }
281+
282+ void garbageCode15 () { // Ticket #5203
283+ checkCode (" int f ( int* r ) { { int s[2] ; f ( s ) ; if ( ) } }" );
284+ }
285+
286+ void garbageCode16 () {
287+ checkCode (" { } A() { delete }" ); // #6080
288+ }
289+
290+ void garbageCode17 () {
291+ ASSERT_THROW (checkCode (" void h(int l) {\n "
292+ " while\n " // Don't crash (#3870)
293+ " }" ), InternalError);
294+ }
295+
296+ void garbageCode18 () {
297+ ASSERT_THROW (checkCode (" switch(){case}" ), InternalError);
298+ }
299+
300+ void garbageCode19 () {
301+ // ticket #3512 - Don't crash on garbage code
302+ ASSERT_EQUALS (" p = const" , checkCode (" 1 *p = const" ));
303+ }
304+
305+ void garbageCode20 () {
306+ // #3953 (valgrind errors on garbage code)
307+ ASSERT_EQUALS (" void f ( 0 * ) ;" , checkCode (" void f ( 0 * ) ;" ));
308+ }
309+
310+ void garbageCode21 () {
311+ // Ticket #3486 - Don't crash garbage code
312+ checkCode (" void f()\n "
313+ " {\n "
314+ " (\n "
315+ " x;\n "
316+ " int a, a2, a2*x; if () ;\n "
317+ " )\n "
318+ " }" );
319+ }
320+
321+ void garbageCode22 () {
322+ // Ticket #3480 - Don't crash garbage code
323+ ASSERT_THROW (checkCode (" int f()\n "
324+ " {\n "
325+ " return if\n "
326+ " }" ), InternalError);
327+ }
328+
329+ void garbageCode23 () {
330+ // garbage code : don't crash (#3481)
331+ checkCode (" {\n "
332+ " if (1) = x\n "
333+ " else abort s[2]\n "
334+ " }" );
335+ ASSERT_EQUALS (" " , errout.str ());
336+ }
337+
338+ void garbageValueFlow () {
339+ // #6089
340+ const char * code = " {} int foo(struct, x1, struct x2, x3, int, x5, x6, x7)\n "
341+ " {\n "
342+ " (foo(s, , 2, , , 5, , 7)) abort()\n "
343+ " }\n " ;
344+ ASSERT_THROW (checkCode (code), InternalError);
345+
346+ // #6106
347+ code = " f { int i ; b2 , [ ] ( for ( i = 0 ; ; ) ) }" ;
348+ checkCode (code);
349+
350+ // 6122 survive garbage code
351+ code = " ; { int i ; for ( i = 0 ; = 123 ; ) - ; }" ;
352+ checkCode (code);
353+ }
354+
355+ void garbageSymbolDatabase () {
356+ checkCode (" void f( { u = 1 ; } ) { }" );
357+
358+ checkCode (" { }; void namespace A::f; { g() { int } }" );
359+
360+ ASSERT_THROW (checkCode (" class Foo {}; class Bar : public Foo" ), InternalError);
361+
362+ ASSERT_THROW (checkCode (" YY_DECL { switch (yy_act) {\n "
363+ " case 65: YY_BREAK\n "
364+ " case YY_STATE_EOF(block):\n "
365+ " yyterminate(); \n "
366+ " } }" ), InternalError); // #5663
367+ }
368+
369+ void garbageAST () {
262370 checkCode (" --" ); // don't crash
263371
264372 checkCode (" N 1024 float a[N], b[N + 3], c[N]; void N; (void) i;\n "
0 commit comments