blob: 0b9e7e3b869836a9c425217991006054fb72fe54 [file] [log] [blame]
/* { dg-additional-options "-fanalyzer-transitivity" } */
#include "analyzer-decls.h"
void test (int i)
{
switch (i)
{
case 0:
__analyzer_eval (i == 0); /* { dg-warning "TRUE" } */
__analyzer_eval (i != -1); /* { dg-warning "TRUE" } */
__analyzer_eval (i != 0); /* { dg-warning "FALSE" } */
__analyzer_eval (i != 1); /* { dg-warning "TRUE" } */
break;
case 3 ... 5:
__analyzer_eval (i != 0); /* { dg-warning "TRUE" } */
__analyzer_eval (i > 1); /* { dg-warning "TRUE" } */
__analyzer_eval (i > 2); /* { dg-warning "TRUE" } */
__analyzer_eval (i >= 2); /* { dg-warning "TRUE" } */
__analyzer_eval (i >= 3); /* { dg-warning "TRUE" } */
__analyzer_eval (i <= 5); /* { dg-warning "TRUE" } */
__analyzer_eval (i < 6); /* { dg-warning "TRUE" } */
__analyzer_eval (i <= 6); /* { dg-warning "TRUE" } */
__analyzer_eval (i < 7); /* { dg-warning "TRUE" } */
__analyzer_eval (i != 6); /* { dg-warning "TRUE" } */
__analyzer_eval (i != 3); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (i != 4); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (i != 5); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (i >= 4); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (i >= 5); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (i <= 3); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (i <= 4); /* { dg-warning "UNKNOWN" } */
break;
default:
__analyzer_eval (i == -1); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (i == 0); /* { dg-warning "FALSE" } */
__analyzer_eval (i == 2); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (i == 3); /* { dg-warning "FALSE" } */
__analyzer_eval (i == 4); /* { dg-warning "FALSE" } */
__analyzer_eval (i == 5); /* { dg-warning "FALSE" } */
__analyzer_eval (i == 6); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (i != 0); /* { dg-warning "TRUE" } */
__analyzer_eval (i != 1); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (i != 3); /* { dg-warning "TRUE" } */
__analyzer_eval (i != 4); /* { dg-warning "TRUE" } */
__analyzer_eval (i != 5); /* { dg-warning "TRUE" } */
__analyzer_eval (i != 6); /* { dg-warning "UNKNOWN" } */
break;
}
}
/* Verify that the analyzer follows the correct paths on a
switch statement guarded by an if, using noinline to defeat
optimizations. */
static void __attribute__((noinline))
__analyzer_called_by_test_2 (int y)
{
switch (y)
{
case 0:
__analyzer_dump_path (); /* { dg-bogus "path" } */
break;
case 1:
__analyzer_dump_path (); /* { dg-message "path" } */
break;
case 2:
__analyzer_dump_path (); /* { dg-bogus "path" } */
break;
default:
__analyzer_dump_path (); /* { dg-bogus "path" } */
break;
}
}
void test_2 (int x)
{
if (x == 1)
__analyzer_called_by_test_2 (x);
}
void test_3 (int x, int y)
{
if (y == 3)
switch (x)
{
case 0 ... 9:
case 20 ... 29:
if (x == y)
__analyzer_dump_path (); /* { dg-message "path" } */
else
__analyzer_dump_path (); /* { dg-message "path" } */
}
}
struct s4
{
unsigned char level:3;
unsigned char key_id_mode:2;
unsigned char reserved:3;
};
void test_4 (struct s4 *p)
{
switch (p->key_id_mode)
{
case 0:
__analyzer_dump_path (); /* { dg-message "path" } */
break;
case 1:
__analyzer_dump_path (); /* { dg-message "path" } */
break;
case 2:
__analyzer_dump_path (); /* { dg-message "path" } */
break;
case 3:
__analyzer_dump_path (); /* { dg-message "path" } */
break;
}
__analyzer_dump_path (); /* { dg-message "path" } */
}
int test_5 (unsigned v)
{
switch (v)
{
case 0:
return 7;
break;
case 1:
return 23;
break;
default:
return v * 2;
}
}
int test_6 (unsigned v)
{
switch (v)
{
case 0:
return 3;
case -1:
return 22;
}
return -3;
}
int g7 = -1;
int test_7 ()
{
switch (g7++) {
case 0:
return 32;
case 100:
return 42;
}
return 0;
}