diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/plugin/decl_plugin.c')
-rw-r--r-- | gcc-4.9/gcc/testsuite/g++.dg/plugin/decl_plugin.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/plugin/decl_plugin.c b/gcc-4.9/gcc/testsuite/g++.dg/plugin/decl_plugin.c new file mode 100644 index 000000000..d44c8f9d4 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/plugin/decl_plugin.c @@ -0,0 +1,52 @@ +/* A plugin example that shows which declarations are caught by FINISH_DECL */ + +#include "gcc-plugin.h" +#include <stdlib.h> +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tree.h" +#include "tree-pass.h" +#include "intl.h" +#include "diagnostic.h" + +int plugin_is_GPL_compatible; + +/* Callback function to invoke after GCC finishes a declaration. */ + +void plugin_finish_decl (void *event_data, void *data) +{ + tree decl = (tree) event_data; + + const char *kind = NULL; + switch (TREE_CODE(decl)) { + case FUNCTION_DECL: + kind = "Function"; break; + case PARM_DECL: + kind = "Parameter"; break; + case VAR_DECL: + if (DECL_FILE_SCOPE_P(decl)) + kind = "Global"; + else + kind = "Local"; + break; + case FIELD_DECL: + kind = "Field"; break; + default: + kind = "Unknown"; + } + + warning (0, G_("Decl %s %s"), + kind, IDENTIFIER_POINTER (DECL_NAME (decl))); +} + +int +plugin_init (struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) +{ + const char *plugin_name = plugin_info->base_name; + + register_callback (plugin_name, PLUGIN_FINISH_DECL, + plugin_finish_decl, NULL); + return 0; +} |