Skip to content

Commit

Permalink
libcpp: add callback for comment-handling
Browse files Browse the repository at this point in the history
gcc/testsuite/ChangeLog:
	* g++.dg/plugin/comment_plugin.c: New test plugin.
	* g++.dg/plugin/comments-1.C: New test file.
	* g++.dg/plugin/plugin.exp (plugin_test_list): Add the above.

libcpp/ChangeLog:
	* include/cpplib.h (struct cpp_callbacks): Add "comment"
	callback.
	* lex.c (_cpp_lex_direct): Call the comment callback if non-NULL.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@248901 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
dmalcolm committed Jun 5, 2017
1 parent cbea241 commit 7b921e0
Show file tree
Hide file tree
Showing 7 changed files with 141 additions and 0 deletions.
6 changes: 6 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2017-06-05 David Malcolm <[email protected]>

* g++.dg/plugin/comment_plugin.c: New test plugin.
* g++.dg/plugin/comments-1.C: New test file.
* g++.dg/plugin/plugin.exp (plugin_test_list): Add the above.

2017-06-05 Bernd Edlinger <[email protected]>

* gcc.misc-tests/gcov-1a.c: New test.
Expand Down
63 changes: 63 additions & 0 deletions gcc/testsuite/g++.dg/plugin/comment_plugin.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/* Test of cpp_callbacks::comments. */

#include "gcc-plugin.h"
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "cpplib.h"
#include "diagnostic.h"
#include "c-family/c-pragma.h"

int plugin_is_GPL_compatible;

/* Test callback for cpp_callbacks::comments. */

void
my_comment_cb (cpp_reader *, source_location loc,
const unsigned char *content, size_t len)
{
if (in_system_header_at (loc))
return;

/* CONTENT contains the opening slash-star (or slash-slash),
and for C-style comments contains the closing star-slash. */
gcc_assert (len >= 2);
gcc_assert (content[0] == '/');
gcc_assert (content[1] == '*' || content[1] == '/');
bool c_style = (content[1] == '*');
if (c_style)
{
gcc_assert (content[len - 2] == '*');
gcc_assert (content[len - 1] == '/');
}

if (c_style)
inform (loc, "got C-style comment; length=%i", len);
else
inform (loc, "got C++-style comment; length=%i", len);

/* Print the content of the comment.
For a C-style comment, the buffer CONTENT contains the opening
slash-star and closing star-slash, so we can't directly verify
it in the DejaGnu test without adding another comment, which
would trigger this callback again.
Hence we skip the syntactically-significant parts of the comment
when printing it. */
fprintf (stderr, "stripped content of comment: >");
/* Avoid printing trailing star-slash. */
if (c_style)
len -= 2;
for (size_t i = 2; i < len; i++)
fputc (content[i], stderr);
fprintf (stderr, "<\n");
}

int
plugin_init (struct plugin_name_args *plugin_info,
struct plugin_gcc_version *version)
{
cpp_callbacks *cb = cpp_get_callbacks (parse_in);
cb->comment = my_comment_cb;

return 0;
}
49 changes: 49 additions & 0 deletions gcc/testsuite/g++.dg/plugin/comments-1.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/* Example of a one-line C-style comment. */
#if 0
{ dg-message "1: got C-style comment; length=45" "" { target *-*-* } .-2 }
{ dg-begin-multiline-output "" }
stripped content of comment: > Example of a one-line C-style comment. <
{ dg-end-multiline-output "" }
#endif

/*Another example of a one-line C-style comment.*/
#if 0
{ dg-message "6: got C-style comment; length=50" "" { target *-*-* } .-2 }
{ dg-begin-multiline-output "" }
stripped content of comment: >Another example of a one-line C-style comment.<
{ dg-end-multiline-output "" }
#endif

/**/
#if 0
{ dg-message "1: got C-style comment; length=4" "" { target *-*-* } .-2 }
{ dg-begin-multiline-output "" }
stripped content of comment: ><
{ dg-end-multiline-output "" }
#endif

/* Example of a
multi-line C-style comment. */
#if 0
{ dg-message "1: got C-style comment; length=50" "" { target *-*-* } .-3 }
{ dg-begin-multiline-output "" }
stripped content of comment: > Example of a
multi-line C-style comment. <
{ dg-end-multiline-output "" }
#endif

// Example of a C++-style comment
#if 0
{ dg-message "1: got C\\+\\+-style comment; length=33" "" { target *-*-* } .-2 }
{ dg-begin-multiline-output "" }
stripped content of comment: > Example of a C++-style comment<
{ dg-end-multiline-output "" }
#endif

//
#if 0
{ dg-message "1: got C\\+\\+-style comment; length=2" "" { target *-*-* } .-2 }
{ dg-begin-multiline-output "" }
stripped content of comment: ><
{ dg-end-multiline-output "" }
#endif
1 change: 1 addition & 0 deletions gcc/testsuite/g++.dg/plugin/plugin.exp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ set plugin_test_list [list \
{ show_template_tree_color_plugin.c \
show-template-tree-color.C \
show-template-tree-color-no-elide-type.C } \
{ comment_plugin.c comments-1.C } \
]

foreach plugin_test $plugin_test_list {
Expand Down
6 changes: 6 additions & 0 deletions libcpp/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2017-06-05 David Malcolm <[email protected]>

* include/cpplib.h (struct cpp_callbacks): Add "comment"
callback.
* lex.c (_cpp_lex_direct): Call the comment callback if non-NULL.

2017-05-02 David Malcolm <[email protected]>

* include/line-map.h (class rich_location): Update description of
Expand Down
9 changes: 9 additions & 0 deletions libcpp/include/cpplib.h
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,15 @@ struct cpp_callbacks

/* Callback for providing suggestions for misspelled directives. */
const char *(*get_suggestion) (cpp_reader *, const char *, const char *const *);

/* Callback for when a comment is encountered, giving the location
of the opening slash, a pointer to the content (which is not
necessarily 0-terminated), and the length of the content.
The content contains the opening slash-star (or slash-slash),
and for C-style comments contains the closing star-slash. For
C++-style comments it does not include the terminating newline. */
void (*comment) (cpp_reader *, source_location, const unsigned char *,
size_t);
};

#ifdef VMS
Expand Down
7 changes: 7 additions & 0 deletions libcpp/lex.c
Original file line number Diff line number Diff line change
Expand Up @@ -2889,6 +2889,13 @@ _cpp_lex_direct (cpp_reader *pfile)
if (fallthrough_comment_p (pfile, comment_start))
fallthrough_comment = true;

if (pfile->cb.comment)
{
size_t len = pfile->buffer->cur - comment_start;
pfile->cb.comment (pfile, result->src_loc, comment_start - 1,
len + 1);
}

if (!pfile->state.save_comments)
{
result->flags |= PREV_WHITE;
Expand Down

0 comments on commit 7b921e0

Please sign in to comment.