mirror of git://gcc.gnu.org/git/gcc.git
invoke.texi (-Wimplicit-fallthrough): Document FALLTHRU comment style changes.
* doc/invoke.texi (-Wimplicit-fallthrough): Document FALLTHRU comment style changes. * lex.c (fallthrough_comment_p): Extend to handle more common FALLTHRU comment styles. * c-c++-common/Wimplicit-fallthrough-23.c (foo): Add further tests. From-SVN: r240885
This commit is contained in:
parent
7bad794aa0
commit
81b02905b0
|
|
@ -1,5 +1,8 @@
|
||||||
2016-10-08 Jakub Jelinek <jakub@redhat.com>
|
2016-10-08 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* doc/invoke.texi (-Wimplicit-fallthrough): Document FALLTHRU comment
|
||||||
|
style changes.
|
||||||
|
|
||||||
* doc/invoke.texi (-Wimplicit-fallthrough): Document the accepted
|
* doc/invoke.texi (-Wimplicit-fallthrough): Document the accepted
|
||||||
FALLTHRU comment styles.
|
FALLTHRU comment styles.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4179,11 +4179,13 @@ should match one of the following regular expressions:
|
||||||
|
|
||||||
@item @code{@@fallthrough@@}
|
@item @code{@@fallthrough@@}
|
||||||
|
|
||||||
@item @code{[ \t]*FALL(S | |-)?THR(OUGH|U)\.?[ \t]*}
|
@item @code{lint -fallthrough ?}
|
||||||
|
|
||||||
@item @code{[ \t]*Fall((s | |-)[Tt]|t)hr(ough|u)\.?[ \t]*}
|
@item @code{[ \t.!]*(ELSE |INTENTIONAL(LY)? )?FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)?}
|
||||||
|
|
||||||
@item @code{[ \t]*fall(s | |-)?thr(ough|u)\.?[ \t]*}
|
@item @code{[ \t.!]*(Else |Intentional(ly)? )?Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)?}
|
||||||
|
|
||||||
|
@item @code{[ \t.!]*([Ee]lse |[Ii]ntentional(ly)? )?fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?}
|
||||||
|
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
2016-10-08 Jakub Jelinek <jakub@redhat.com>
|
2016-10-08 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* c-c++-common/Wimplicit-fallthrough-23.c (foo): Add further tests.
|
||||||
|
|
||||||
* c-c++-common/Wimplicit-fallthrough-23.c: New test.
|
* c-c++-common/Wimplicit-fallthrough-23.c: New test.
|
||||||
* c-c++-common/Wimplicit-fallthrough-24.c: New test.
|
* c-c++-common/Wimplicit-fallthrough-24.c: New test.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,15 +21,39 @@ foo (int i)
|
||||||
case 4:
|
case 4:
|
||||||
bar (4);
|
bar (4);
|
||||||
break;
|
break;
|
||||||
|
case 5:
|
||||||
|
bar (5); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
/* Else Fall-Thru! */
|
||||||
|
case 6:
|
||||||
|
bar (6);
|
||||||
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
bar (7); /* { dg-bogus "this statement may \[laf]* through" } */
|
bar (7); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
/* Some comment. */
|
/* Some comment. */
|
||||||
/* fallthrough. */
|
/* ... fallthrough ... */
|
||||||
/* Some other comment. */
|
/* Some other comment. */
|
||||||
/* And yet another. */
|
/* And yet another. */
|
||||||
case 8:
|
case 8:
|
||||||
bar (8);
|
bar (8);
|
||||||
break;
|
break;
|
||||||
|
case 9:
|
||||||
|
bar (9); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
/* Intentional Fallthru */
|
||||||
|
case 10:
|
||||||
|
bar (10);
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
bar (11); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
/* intentionally fall through */
|
||||||
|
case 12:
|
||||||
|
bar (12);
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
bar (13); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
/* Falls Through - for reasons known only to the author. */
|
||||||
|
case 14:
|
||||||
|
bar (14);
|
||||||
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
bar (15); /* { dg-bogus "this statement may \[laf]* through" } */
|
bar (15); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
/*-fallthrough*/
|
/*-fallthrough*/
|
||||||
|
|
@ -42,12 +66,42 @@ foo (int i)
|
||||||
case 18:
|
case 18:
|
||||||
bar (18);
|
bar (18);
|
||||||
break;
|
break;
|
||||||
|
case 19:
|
||||||
|
bar (19); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
/*lint -fallthrough*/
|
||||||
|
case 20:
|
||||||
|
bar (20);
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
bar (21); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
/*lint -fallthrough */
|
||||||
|
case 22:
|
||||||
|
bar (22);
|
||||||
|
break;
|
||||||
case 23:
|
case 23:
|
||||||
bar (23); /* { dg-bogus "this statement may \[laf]* through" } */
|
bar (23); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
/*fallthru*/
|
/*fallthru*/
|
||||||
case 24:
|
case 24:
|
||||||
bar (24);
|
bar (24);
|
||||||
break;
|
break;
|
||||||
|
case 25:
|
||||||
|
bar (25); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
/*Else fallthru*/
|
||||||
|
case 26:
|
||||||
|
bar (26);
|
||||||
|
break;
|
||||||
|
case 27:
|
||||||
|
bar (27); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
/*Intentional fallthru*/
|
||||||
|
case 28:
|
||||||
|
bar (28);
|
||||||
|
break;
|
||||||
|
case 29:
|
||||||
|
bar (29); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
/*Intentionally fallthru*/
|
||||||
|
case 30:
|
||||||
|
bar (30);
|
||||||
|
break;
|
||||||
case 31:
|
case 31:
|
||||||
bar (31); /* { dg-bogus "this statement may \[laf]* through" } */
|
bar (31); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
/*Falls thru*/
|
/*Falls thru*/
|
||||||
|
|
@ -78,15 +132,39 @@ foo (int i)
|
||||||
case 4:
|
case 4:
|
||||||
bar (4);
|
bar (4);
|
||||||
break;
|
break;
|
||||||
|
case 5:
|
||||||
|
bar (5); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
// Else Fall-Thru!
|
||||||
|
case 6:
|
||||||
|
bar (6);
|
||||||
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
bar (7); /* { dg-bogus "this statement may \[laf]* through" } */
|
bar (7); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
// Some comment.
|
// Some comment.
|
||||||
// fallthrough
|
// ... fallthrough ...
|
||||||
// Some other comment.
|
// Some other comment.
|
||||||
// And yet another.
|
// And yet another.
|
||||||
case 8:
|
case 8:
|
||||||
bar (8);
|
bar (8);
|
||||||
break;
|
break;
|
||||||
|
case 9:
|
||||||
|
bar (9); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
// Intentional Fallthru
|
||||||
|
case 10:
|
||||||
|
bar (10);
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
bar (11); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
// intentionally fall through
|
||||||
|
case 12:
|
||||||
|
bar (12);
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
bar (13); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
// Falls Through - for reasons known only to the author.
|
||||||
|
case 14:
|
||||||
|
bar (14);
|
||||||
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
bar (15); /* { dg-bogus "this statement may \[laf]* through" } */
|
bar (15); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
//-fallthrough
|
//-fallthrough
|
||||||
|
|
@ -99,12 +177,42 @@ foo (int i)
|
||||||
case 18:
|
case 18:
|
||||||
bar (18);
|
bar (18);
|
||||||
break;
|
break;
|
||||||
|
case 19:
|
||||||
|
bar (19); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
//lint -fallthrough
|
||||||
|
case 20:
|
||||||
|
bar (20);
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
bar (21); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
//lint -fallthrough
|
||||||
|
case 22:
|
||||||
|
bar (22);
|
||||||
|
break;
|
||||||
case 23:
|
case 23:
|
||||||
bar (23); /* { dg-bogus "this statement may \[laf]* through" } */
|
bar (23); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
//fallthru
|
//fallthru
|
||||||
case 24:
|
case 24:
|
||||||
bar (24);
|
bar (24);
|
||||||
break;
|
break;
|
||||||
|
case 25:
|
||||||
|
bar (25); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
//Else fallthru
|
||||||
|
case 26:
|
||||||
|
bar (26);
|
||||||
|
break;
|
||||||
|
case 27:
|
||||||
|
bar (27); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
//Intentional fallthru
|
||||||
|
case 28:
|
||||||
|
bar (28);
|
||||||
|
break;
|
||||||
|
case 29:
|
||||||
|
bar (29); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
|
//Intentionally fallthru
|
||||||
|
case 30:
|
||||||
|
bar (30);
|
||||||
|
break;
|
||||||
case 31:
|
case 31:
|
||||||
bar (31); /* { dg-bogus "this statement may \[laf]* through" } */
|
bar (31); /* { dg-bogus "this statement may \[laf]* through" } */
|
||||||
//Falls thru
|
//Falls thru
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
2016-10-08 Jakub Jelinek <jakub@redhat.com>
|
2016-10-08 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* lex.c (fallthrough_comment_p): Extend to handle more common FALLTHRU
|
||||||
|
comment styles.
|
||||||
|
|
||||||
* lex.c (fallthrough_comment_p): Fix off-by-one size comparison
|
* lex.c (fallthrough_comment_p): Fix off-by-one size comparison
|
||||||
errors, cleanup.
|
errors, cleanup.
|
||||||
(_cpp_lex_direct): Allow arbitrary comments in between
|
(_cpp_lex_direct): Allow arbitrary comments in between
|
||||||
|
|
|
||||||
98
libcpp/lex.c
98
libcpp/lex.c
|
|
@ -2060,22 +2060,86 @@ fallthrough_comment_p (cpp_reader *pfile, const unsigned char *comment_start)
|
||||||
from += 1 + len;
|
from += 1 + len;
|
||||||
}
|
}
|
||||||
/* Whole comment contents (regex):
|
/* Whole comment contents (regex):
|
||||||
[ \t]*FALL(S | |-)?THR(OUGH|U)\.?[ \t]*
|
lint -fallthrough ?
|
||||||
[ \t]*Fall((s | |-)[Tt]|t)hr(ough|u)\.?[ \t]*
|
*/
|
||||||
[ \t]*fall(s | |-)?thr(ough|u)\.?[ \t]*
|
else if (*from == 'l')
|
||||||
|
{
|
||||||
|
size_t len = sizeof "int -fallthrough" - 1;
|
||||||
|
if ((size_t) (pfile->buffer->cur - from - 1) < len)
|
||||||
|
return false;
|
||||||
|
if (memcmp (from + 1, "int -fallthrough", len))
|
||||||
|
return false;
|
||||||
|
from += 1 + len;
|
||||||
|
if (*from == ' ')
|
||||||
|
from++;
|
||||||
|
}
|
||||||
|
/* Whole comment contents (regex):
|
||||||
|
[ \t.!]*(ELSE |INTENTIONAL(LY)? )?FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)?
|
||||||
|
[ \t.!]*(Else |Intentional(ly)? )?Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)?
|
||||||
|
[ \t.!]*([Ee]lse |[Ii]ntentional(ly)? )?fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?
|
||||||
*/
|
*/
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (*from == ' ' || *from == '\t')
|
while (*from == ' ' || *from == '\t' || *from == '.' || *from == '!')
|
||||||
from++;
|
from++;
|
||||||
unsigned char f = *from;
|
unsigned char f = *from;
|
||||||
|
bool all_upper = false;
|
||||||
|
if (f == 'E' || f == 'e')
|
||||||
|
{
|
||||||
|
if ((size_t) (pfile->buffer->cur - from)
|
||||||
|
< sizeof "else fallthru" - 1)
|
||||||
|
return false;
|
||||||
|
if (f == 'E' && memcmp (from + 1, "LSE F", sizeof "LSE F" - 1) == 0)
|
||||||
|
all_upper = true;
|
||||||
|
else if (memcmp (from + 1, "lse ", sizeof "lse " - 1))
|
||||||
|
return false;
|
||||||
|
from += sizeof "else " - 1;
|
||||||
|
if (f == 'e' && *from == 'F')
|
||||||
|
return false;
|
||||||
|
f = *from;
|
||||||
|
}
|
||||||
|
else if (f == 'I' || f == 'i')
|
||||||
|
{
|
||||||
|
if ((size_t) (pfile->buffer->cur - from)
|
||||||
|
< sizeof "intentional fallthru" - 1)
|
||||||
|
return false;
|
||||||
|
if (f == 'I' && memcmp (from + 1, "NTENTIONAL",
|
||||||
|
sizeof "NTENTIONAL" - 1) == 0)
|
||||||
|
all_upper = true;
|
||||||
|
else if (memcmp (from + 1, "ntentional",
|
||||||
|
sizeof "ntentional" - 1))
|
||||||
|
return false;
|
||||||
|
from += sizeof "intentional" - 1;
|
||||||
|
if (*from == ' ')
|
||||||
|
{
|
||||||
|
from++;
|
||||||
|
if (all_upper && *from == 'f')
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (all_upper)
|
||||||
|
{
|
||||||
|
if (memcmp (from, "LY F", sizeof "LY F" - 1))
|
||||||
|
return false;
|
||||||
|
from += sizeof "LY " - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (memcmp (from, "ly ", sizeof "ly " - 1))
|
||||||
|
return false;
|
||||||
|
from += sizeof "ly " - 1;
|
||||||
|
}
|
||||||
|
if (f == 'i' && *from == 'F')
|
||||||
|
return false;
|
||||||
|
f = *from;
|
||||||
|
}
|
||||||
if (f != 'F' && f != 'f')
|
if (f != 'F' && f != 'f')
|
||||||
return false;
|
return false;
|
||||||
if ((size_t) (pfile->buffer->cur - from) < sizeof "fallthru" - 1)
|
if ((size_t) (pfile->buffer->cur - from) < sizeof "fallthru" - 1)
|
||||||
return false;
|
return false;
|
||||||
bool all_upper = false;
|
|
||||||
if (f == 'F' && memcmp (from + 1, "ALL", sizeof "ALL" - 1) == 0)
|
if (f == 'F' && memcmp (from + 1, "ALL", sizeof "ALL" - 1) == 0)
|
||||||
all_upper = true;
|
all_upper = true;
|
||||||
|
else if (all_upper)
|
||||||
|
return false;
|
||||||
else if (memcmp (from + 1, "all", sizeof "all" - 1))
|
else if (memcmp (from + 1, "all", sizeof "all" - 1))
|
||||||
return false;
|
return false;
|
||||||
from += sizeof "fall" - 1;
|
from += sizeof "fall" - 1;
|
||||||
|
|
@ -2100,10 +2164,28 @@ fallthrough_comment_p (cpp_reader *pfile, const unsigned char *comment_start)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
from += sizeof "thru" - 1;
|
from += sizeof "thru" - 1;
|
||||||
if (*from == '.')
|
while (*from == ' ' || *from == '\t' || *from == '.' || *from == '!')
|
||||||
from++;
|
|
||||||
while (*from == ' ' || *from == '\t')
|
|
||||||
from++;
|
from++;
|
||||||
|
if (*from == '-')
|
||||||
|
{
|
||||||
|
from++;
|
||||||
|
if (*comment_start == '*')
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
while (*from && *from != '*'
|
||||||
|
&& *from != '\n' && *from != '\r')
|
||||||
|
from++;
|
||||||
|
if (*from != '*' || from[1] == '/')
|
||||||
|
break;
|
||||||
|
from++;
|
||||||
|
}
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
while (*from && *from != '\n' && *from != '\r')
|
||||||
|
from++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* C block comment. */
|
/* C block comment. */
|
||||||
if (*comment_start == '*')
|
if (*comment_start == '*')
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue