summaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-10-08 12:48:54 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-10-08 12:48:54 +0200
commit7bad794aa005aa3ee52fc9c872051d8346c09a24 (patch)
treedbcbde73147d32631dd626a01571e5964d9ff5fe /libcpp
parent6dc29c6db124fab32ab9b69cfb283e078cc881fc (diff)
downloadgcc-7bad794aa005aa3ee52fc9c872051d8346c09a24.tar.gz
c-lex.c (c_lex_with_flags): For CPP_COMMENT token with PREV_FALLTHROUGH...
* c-lex.c (c_lex_with_flags) <case CPP_COMMENT>: For CPP_COMMENT token with PREV_FALLTHROUGH, skip all following CPP_PADDING and CPP_COMMENT tokens and set add_flags to PREV_FALLTHROUGH afterwards. * doc/invoke.texi (-Wimplicit-fallthrough): Document the accepted FALLTHRU comment styles. * lex.c (fallthrough_comment_p): Fix off-by-one size comparison errors, cleanup. (_cpp_lex_direct): Allow arbitrary comments in between fallthrough_comment_p comment and following token. * c-c++-common/Wimplicit-fallthrough-23.c: New test. * c-c++-common/Wimplicit-fallthrough-24.c: New test. From-SVN: r240884
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/ChangeLog7
-rw-r--r--libcpp/lex.c36
2 files changed, 25 insertions, 18 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 96b9047501b..faecb162caf 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,10 @@
+2016-10-08 Jakub Jelinek <jakub@redhat.com>
+
+ * lex.c (fallthrough_comment_p): Fix off-by-one size comparison
+ errors, cleanup.
+ (_cpp_lex_direct): Allow arbitrary comments in between
+ fallthrough_comment_p comment and following token.
+
2016-10-04 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR target/77847
diff --git a/libcpp/lex.c b/libcpp/lex.c
index 6d2e596e2d4..d960aa869e4 100644
--- a/libcpp/lex.c
+++ b/libcpp/lex.c
@@ -2061,7 +2061,7 @@ fallthrough_comment_p (cpp_reader *pfile, const unsigned char *comment_start)
}
/* Whole comment contents (regex):
[ \t]*FALL(S | |-)?THR(OUGH|U)\.?[ \t]*
- [ \t]*Fall(s | |-)?[Tt]hr(ough|u)\.?[ \t]*
+ [ \t]*Fall((s | |-)[Tt]|t)hr(ough|u)\.?[ \t]*
[ \t]*fall(s | |-)?thr(ough|u)\.?[ \t]*
*/
else
@@ -2071,30 +2071,27 @@ fallthrough_comment_p (cpp_reader *pfile, const unsigned char *comment_start)
unsigned char f = *from;
if (f != 'F' && f != 'f')
return false;
- if ((size_t) (pfile->buffer->cur - from) < sizeof "fallthrough")
+ if ((size_t) (pfile->buffer->cur - from) < sizeof "fallthru" - 1)
return false;
bool all_upper = false;
if (f == 'F' && memcmp (from + 1, "ALL", sizeof "ALL" - 1) == 0)
all_upper = true;
else if (memcmp (from + 1, "all", sizeof "all" - 1))
return false;
- if (from[sizeof "fall" - 1] == (all_upper ? 'S' : 's')
- && from[sizeof "falls" - 1] == ' ')
- from += sizeof "falls " - 1;
- else if (from[sizeof "fall" - 1] == ' '
- || from[sizeof "fall" - 1] == '-')
- from += sizeof "fall " - 1;
- else if (from[sizeof "fall" - 1] != (all_upper ? 'T' : 't'))
+ from += sizeof "fall" - 1;
+ if (*from == (all_upper ? 'S' : 's') && from[1] == ' ')
+ from += 2;
+ else if (*from == ' ' || *from == '-')
+ from++;
+ else if (*from != (all_upper ? 'T' : 't'))
return false;
- else
- from += sizeof "fall" - 1;
if ((f == 'f' || *from != 'T') && (all_upper || *from != 't'))
return false;
- if ((size_t) (pfile->buffer->cur - from) < sizeof "thru")
+ if ((size_t) (pfile->buffer->cur - from) < sizeof "thru" - 1)
return false;
if (memcmp (from + 1, all_upper ? "HRU" : "hru", sizeof "hru" - 1))
{
- if ((size_t) (pfile->buffer->cur - from) < sizeof "through")
+ if ((size_t) (pfile->buffer->cur - from) < sizeof "through" - 1)
return false;
if (memcmp (from + 1, all_upper ? "HROUGH" : "hrough",
sizeof "hrough" - 1))
@@ -2399,7 +2396,8 @@ _cpp_lex_direct (cpp_reader *pfile)
{
cppchar_t c;
cpp_buffer *buffer;
- const unsigned char *comment_start = NULL;
+ const unsigned char *comment_start;
+ bool fallthrough_comment = false;
cpp_token *result = pfile->cur_token++;
fresh_line:
@@ -2427,7 +2425,7 @@ _cpp_lex_direct (cpp_reader *pfile)
return result;
}
if (buffer != pfile->buffer)
- comment_start = NULL;
+ fallthrough_comment = false;
if (!pfile->keep_tokens)
{
pfile->cur_run = &pfile->base_run;
@@ -2536,8 +2534,7 @@ _cpp_lex_direct (cpp_reader *pfile)
}
/* Signal FALLTHROUGH comment followed by another token. */
- if (comment_start
- && fallthrough_comment_p (pfile, comment_start))
+ if (fallthrough_comment)
result->flags |= PREV_FALLTHROUGH;
break;
@@ -2624,13 +2621,16 @@ _cpp_lex_direct (cpp_reader *pfile)
break;
}
+ if (fallthrough_comment_p (pfile, comment_start))
+ fallthrough_comment = true;
+
if (!pfile->state.save_comments)
{
result->flags |= PREV_WHITE;
goto update_tokens_line;
}
- if (fallthrough_comment_p (pfile, comment_start))
+ if (fallthrough_comment)
result->flags |= PREV_FALLTHROUGH;
/* Save the comment as a token in its own right. */