This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug preprocessor/33305] We should warn about empty macro arguments
- From: "manu at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 9 Nov 2007 02:09:35 -0000
- Subject: [Bug preprocessor/33305] We should warn about empty macro arguments
- References: <bug-33305-578@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #4 from manu at gcc dot gnu dot org 2007-11-09 02:09 -------
(In reply to comment #3)
> Anyone know where in the preprocessor this should be done? I.e. which function
> in libcpp?
>
> If someone would let me know, I'll write a patch.
>
This is the patch I was playing with before giving up. I don't know how to get
the correct line numbers so I tried 3 possibilities.
Index: libcpp/macro.c
===================================================================
--- libcpp/macro.c (revision 129897)
+++ libcpp/macro.c (working copy)
@@ -681,9 +681,39 @@ collect_args (cpp_reader *pfile, const c
}
else
{
+ unsigned int i;
+
/* A single empty argument is counted as no argument. */
if (argc == 1 && macro->paramc == 0 && args[0].count == 0)
argc = 0;
+
+ for (i = 0; i < argc; i++)
+ {
+ if (args[i].count == 0
+ && CPP_OPTION (pfile, pedantic)
+ && CPP_OPTION (pfile, lang) == CLK_GNUC89)
+ {
+ if (pfile->context->prev && pfile->context->prev->macro)
+ cpp_error_with_line (pfile, CPP_DL_PEDWARN,
+ pfile->context->prev->macro->value.macro->line, 0,
+ "invoking macro \"%s\" "
+ "with empty arguments is undefined in ISO C90",
+ NODE_NAME (node));
+ else if (pfile->context->prev || pfile->state.in_directive)
+ cpp_error_with_line (pfile, CPP_DL_PEDWARN,
+ node->value.macro->line, 0,
+ "invoking macro \"%s\" "
+ "with empty arguments is undefined in ISO C90",
+ NODE_NAME (node));
+ else
+ cpp_error (pfile, CPP_DL_PEDWARN,
+ "invoking macro \"%s\" "
+ "with empty arguments is undefined in ISO C90",
+ NODE_NAME (node));
+
+ }
+ }
+
if (_cpp_arguments_ok (pfile, macro, node, argc))
{
/* GCC has special semantics for , ## b where b is a varargs
And this is the testcase I am using:
/* { dg-do compile } */
/* { dg-options "-std=c90 -pedantic-errors" } */
#define f2(a,b,c) a; b; c;
#define f(a,b) f2(a,,b) /* { dg-warning "macro "f2" with empty arguments } */
#define f3(a) a
#define g() 0
void foo(void)
{
f(0,0);
f2(0,,0); /* { dg-warning "macro "f2" with empty arguments } */
f3(); /* { dg-warning "macro "f3" with empty arguments } */
g();
}
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33305