diff options
author | David Malcolm <dmalcolm@redhat.com> | 2017-06-05 20:53:06 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2017-06-05 20:53:06 +0000 |
commit | 05945a1b8356818a441b3d358c8d803ee52eb778 (patch) | |
tree | d602be4faec521df3252fd78c8aaab8cd7f563d7 /gcc | |
parent | 9b972837bd72fc1e709206e19492123a6df2aada (diff) | |
download | gcc-05945a1b8356818a441b3d358c8d803ee52eb778.zip gcc-05945a1b8356818a441b3d358c8d803ee52eb778.tar.gz gcc-05945a1b8356818a441b3d358c8d803ee52eb778.tar.bz2 |
libcpp: add callback for comment-handling
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.
From-SVN: r248901
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/plugin/comment_plugin.c | 63 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/plugin/comments-1.C | 49 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/plugin/plugin.exp | 1 |
4 files changed, 119 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa7ee04..f1bb404 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-06-05 David Malcolm <dmalcolm@redhat.com> + + * 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 <bernd.edlinger@hotmail.de> * gcc.misc-tests/gcov-1a.c: New test. diff --git a/gcc/testsuite/g++.dg/plugin/comment_plugin.c b/gcc/testsuite/g++.dg/plugin/comment_plugin.c new file mode 100644 index 0000000..c3b08e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/comment_plugin.c @@ -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; +} diff --git a/gcc/testsuite/g++.dg/plugin/comments-1.C b/gcc/testsuite/g++.dg/plugin/comments-1.C new file mode 100644 index 0000000..0821b14 --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/comments-1.C @@ -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 diff --git a/gcc/testsuite/g++.dg/plugin/plugin.exp b/gcc/testsuite/g++.dg/plugin/plugin.exp index 94ebe93..e40cba3 100644 --- a/gcc/testsuite/g++.dg/plugin/plugin.exp +++ b/gcc/testsuite/g++.dg/plugin/plugin.exp @@ -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 { |