Commit e1aa5140 by Kaveh R. Ghazi Committed by Kaveh Ghazi

cppmacro.c (check_trad_stringification): New function.

	* cppmacro.c (check_trad_stringification): New function.
	(save_expansion): If -Wtraditional, warn about stringification of
	macro arguments.

testsuite:
	* gcc.dg/cpp/tr-warn6.c: New test.

From-SVN: r36285
parent afa1738b
2000-09-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* cppmacro.c (check_trad_stringification): New function.
(save_expansion): If -Wtraditional, warn about stringification of
macro arguments.
2000-09-11 Michael Hayes <mhayes@cygnus.com> 2000-09-11 Michael Hayes <mhayes@cygnus.com>
* loop.h (struct loop_mem_info): Move from loop.c * loop.h (struct loop_mem_info): Move from loop.c
......
...@@ -52,6 +52,9 @@ static const cpp_toklist * save_expansion PARAMS((cpp_reader *, ...@@ -52,6 +52,9 @@ static const cpp_toklist * save_expansion PARAMS((cpp_reader *,
static unsigned int find_param PARAMS ((const cpp_token *, static unsigned int find_param PARAMS ((const cpp_token *,
const cpp_token *)); const cpp_token *));
static cpp_toklist * alloc_macro PARAMS ((cpp_reader *, struct macro_info *)); static cpp_toklist * alloc_macro PARAMS ((cpp_reader *, struct macro_info *));
static void check_trad_stringification PARAMS ((cpp_reader *,
const struct macro_info *,
const cpp_string *));
/* These are all the tokens that can have something pasted after them. /* These are all the tokens that can have something pasted after them.
Comma is included in the list only to support the GNU varargs extension Comma is included in the list only to support the GNU varargs extension
...@@ -502,6 +505,12 @@ save_expansion (pfile, info) ...@@ -502,6 +505,12 @@ save_expansion (pfile, info)
continue; continue;
break; break;
case CPP_STRING:
case CPP_CHAR:
if (CPP_WTRADITIONAL (pfile) && list->paramc > 0)
check_trad_stringification (pfile, info, &token->val.str);
break;
default: default:
break; break;
} }
...@@ -618,3 +627,46 @@ dump_macro_args (fp, list) ...@@ -618,3 +627,46 @@ dump_macro_args (fp, list)
} }
putc (')', fp); putc (')', fp);
} }
/* Warn if a token in `string' matches one of the function macro
arguments in `info'. This function assumes that the macro is a
function macro and not an object macro. */
static void
check_trad_stringification (pfile, info, string)
cpp_reader *pfile;
const struct macro_info *info;
const cpp_string *string;
{
const U_CHAR *p, *q, *limit = string->text + string->len;
/* Loop over the string. */
for (p = string->text; p < limit; p = q)
{
const cpp_token *token;
/* Find the start of an identifier. */
while (!is_idstart (*p) && p < limit) p++;
/* Find the end of the identifier. */
q = p;
while (is_idchar (*q) && q < limit) q++;
/* Loop over the function macro arguments to see if the
identifier inside the string matches one of them. */
for (token = info->first_param; token < info->first; token++)
{
/* Skip the commas in between the arguments. */
if (token->type != CPP_NAME)
continue;
if (token->val.node->length == (q - p)
&& !memcmp (p, token->val.node->name, (q - p)))
{
cpp_warning (pfile,
"macro arg \"%.*s\" would be stringified with -traditional.",
(int) (q - p), p);
break;
}
}
}
}
2000-09-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/cpp/tr-warn6.c: New test
2000-09-07 Joseph S. Myers <jsm28@cam.ac.uk> 2000-09-07 Joseph S. Myers <jsm28@cam.ac.uk>
* gcc.dg/format-ext-3.c: Test %#b and %#h as formats that should * gcc.dg/format-ext-3.c: Test %#b and %#h as formats that should
......
/* Test for -Wtraditional warnings for stringification of macro args.
Note, gcc should omit these warnings in system header files.
By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 9/8/2000. */
/* { dg-do preprocess } */
/* { dg-options "-Wtraditional -fno-show-column" } */
#define foo1(h) sdf "h3" fds "h" /* { dg-warning "macro arg \"h\" would be stringified" "traditional stringification" } */
#define foo2(h2) sdf "h2" fds "h3" /* { dg-warning "macro arg \"h2\" would be stringified" "traditional stringification" } */
#define foo3(h3) sdf "h2" fds "h3" /* { dg-warning "macro arg \"h3\" would be stringified" "traditional stringification" } */
#define foo4(h) sdf 'h3' fds 'h' /* { dg-warning "macro arg \"h\" would be stringified" "traditional stringification" } */
#define foo5(h2) sdf 'h2' fds 'h3' /* { dg-warning "macro arg \"h2\" would be stringified" "traditional stringification" } */
#define foo6(h3) sdf 'h2' fds 'h3' /* { dg-warning "macro arg \"h3\" would be stringified" "traditional stringification" } */
#define foo7(AA, hello, world, EEE) sdf "A B hello C,world,DhelloE F" fds EEE /* { dg-warning "macro arg \"hello\" would be stringified" "traditional stringification" } */
/* Catch the second warning from the above line. */
/* { dg-warning "macro arg \"world\" would be stringified" "traditional stringification" { target *-*-* } 13 } */
#line 19 "sys-header.h" 3
/* We are in system headers now, no -Wtraditional warnings should issue. */
#define bar1(h) sdf "h3" fds "h"
#define bar2(h2) sdf "h2" fds "h3"
#define bar3(h3) sdf "h2" fds "h3"
#define bar4(h) sdf 'h3' fds 'h'
#define bar5(h2) sdf 'h2' fds 'h3'
#define bar6(h3) sdf 'h2' fds 'h3'
#define bar7(AA, hello, world, EEE) sdf "A B hello C,world,DhelloE F" fds EEE
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment