public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: PATCH: work-around for bug in -traditional-cpp
       [not found] <bqb9lu$m85$2@clipper.ens.fr>
@ 2003-12-07 18:30 ` Marc Espie
  0 siblings, 0 replies; 4+ messages in thread
From: Marc Espie @ 2003-12-07 18:30 UTC (permalink / raw)
  To: gcc

In article <bqb9lu$m85$2@clipper.ens.fr> you write:
>On Sat, Nov 29, 2003 at 09:50:42PM +0000, Neil Booth wrote:
>> > 
>> > Okay, it looks like trad-cpp is messing with skipping.
>> 
>> If you're skipping you shouldn't even be attempting to expand
>> macros.
>
>Yes, sure. But I don't think trad-cpp knows whether it's skipping
>at this point. It does expand macros early, and then it will use
>them or discard them when it finds out whether it's skipping or not.
>
>This is not my code. I'm only concerned about not getting warnings
>when I should not get any, e.g., make the code work.
>
>If you can figure what's actually going on, and can clean it up,
>that will be fine.
>

Okay, is anybody actually intending to look deeper at this code ?
The work-around I posted actually fixes things for me, and if no-one
wants to search at what's going on deeper, I believe that a preprocessor
without bogus warnings is better than a preprocessor with bogus warnings...

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: PATCH: work-around for bug in -traditional-cpp
  2003-11-29 23:11     ` Neil Booth
@ 2003-11-29 23:52       ` Marc Espie
  0 siblings, 0 replies; 4+ messages in thread
From: Marc Espie @ 2003-11-29 23:52 UTC (permalink / raw)
  To: Neil Booth; +Cc: Andreas Schwab, gcc, gcc-patches

On Sat, Nov 29, 2003 at 09:50:42PM +0000, Neil Booth wrote:
> > 
> > Okay, it looks like trad-cpp is messing with skipping.
> 
> If you're skipping you shouldn't even be attempting to expand
> macros.

Yes, sure. But I don't think trad-cpp knows whether it's skipping
at this point. It does expand macros early, and then it will use
them or discard them when it finds out whether it's skipping or not.

This is not my code. I'm only concerned about not getting warnings
when I should not get any, e.g., make the code work.

If you can figure what's actually going on, and can clean it up,
that will be fine.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: PATCH: work-around for bug in -traditional-cpp
  2003-11-29 18:14   ` PATCH: work-around for bug in -traditional-cpp Marc Espie
@ 2003-11-29 23:11     ` Neil Booth
  2003-11-29 23:52       ` Marc Espie
  0 siblings, 1 reply; 4+ messages in thread
From: Neil Booth @ 2003-11-29 23:11 UTC (permalink / raw)
  To: Marc Espie; +Cc: Andreas Schwab, gcc, gcc-patches

Marc Espie wrote:-

> On Tue, Nov 25, 2003 at 02:27:50PM +0100, Andreas Schwab wrote:
> > An even simpler test case:
> > 
> > #define a(b,c)
> > #if 0
> > #define b(x,y) a(x)
> > #endif
> > 
> > cpp.c:3: macro "a" requires 2 arguments, but only 1 given
> > 
> > Interestingly, changing #if 0 to #if 1 removes the error.
> 
> Okay, it looks like trad-cpp is messing with skipping.

If you're skipping you shouldn't even be attempting to expand
macros.

Neil.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* PATCH: work-around for bug in -traditional-cpp
  2003-11-25 17:01 ` Andreas Schwab
@ 2003-11-29 18:14   ` Marc Espie
  2003-11-29 23:11     ` Neil Booth
  0 siblings, 1 reply; 4+ messages in thread
From: Marc Espie @ 2003-11-29 18:14 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: gcc, gcc-patches

On Tue, Nov 25, 2003 at 02:27:50PM +0100, Andreas Schwab wrote:
> An even simpler test case:
> 
> #define a(b,c)
> #if 0
> #define b(x,y) a(x)
> #endif
> 
> cpp.c:3: macro "a" requires 2 arguments, but only 1 given
> 
> Interestingly, changing #if 0 to #if 1 removes the error.

Okay, it looks like trad-cpp is messing with skipping.
I have at least a work-around for the bug.
It probably means cpp -traditional will no longer emit some needed
warnings, but it will at least stop emitting bogus ones.




2003-11-29  Marc Espie <espie@openbsd.org>
	* cpphash.h (_cpp_arguments_ok):  Add extra argument.
	* cppmacro.c (_cpp_argument_ok, collect_args):  Define and use
	extra argument silent to remove diagnostic messages.
	* cpptrad.c (scan_out_logical_line):  Use silent to remove bogus
	diagnostic messages.

Index: cpphash.h
===================================================================
RCS file: /cvs/src/gnu/usr.bin/gcc/gcc/cpphash.h,v
retrieving revision 1.1.1.1
diff -c -p -r1.1.1.1 cpphash.h
*** cpphash.h	29 Nov 2003 12:21:46 -0000	1.1.1.1
--- cpphash.h	29 Nov 2003 15:45:22 -0000
*************** extern bool _cpp_save_parameter		PARAMS 
*** 503,509 ****
  						 cpp_hashnode *));
  extern bool _cpp_arguments_ok		PARAMS ((cpp_reader *, cpp_macro *,
  						 const cpp_hashnode *,
! 						 unsigned int));
  extern const uchar *_cpp_builtin_macro_text PARAMS ((cpp_reader *,
  						     cpp_hashnode *));
  int _cpp_warn_if_unused_macro		PARAMS ((cpp_reader *, cpp_hashnode *,
--- 503,509 ----
  						 cpp_hashnode *));
  extern bool _cpp_arguments_ok		PARAMS ((cpp_reader *, cpp_macro *,
  						 const cpp_hashnode *,
! 						 unsigned int, int));
  extern const uchar *_cpp_builtin_macro_text PARAMS ((cpp_reader *,
  						     cpp_hashnode *));
  int _cpp_warn_if_unused_macro		PARAMS ((cpp_reader *, cpp_hashnode *,
Index: cppmacro.c
===================================================================
RCS file: /cvs/src/gnu/usr.bin/gcc/gcc/cppmacro.c,v
retrieving revision 1.1.1.1
diff -c -p -r1.1.1.1 cppmacro.c
*** cppmacro.c	29 Nov 2003 12:21:50 -0000	1.1.1.1
--- cppmacro.c	29 Nov 2003 15:45:23 -0000
*************** paste_all_tokens (pfile, lhs)
*** 520,530 ****
     Note that MACRO cannot necessarily be deduced from NODE, in case
     NODE was redefined whilst collecting arguments.  */
  bool
! _cpp_arguments_ok (pfile, macro, node, argc)
       cpp_reader *pfile;
       cpp_macro *macro;
       const cpp_hashnode *node;
       unsigned int argc;
  {
    if (argc == macro->paramc)
      return true;
--- 520,531 ----
     Note that MACRO cannot necessarily be deduced from NODE, in case
     NODE was redefined whilst collecting arguments.  */
  bool
! _cpp_arguments_ok (pfile, macro, node, argc, silent)
       cpp_reader *pfile;
       cpp_macro *macro;
       const cpp_hashnode *node;
       unsigned int argc;
+      int silent;
  {
    if (argc == macro->paramc)
      return true;
*************** _cpp_arguments_ok (pfile, macro, node, a
*** 541,560 ****
  
        if (argc + 1 == macro->paramc && macro->variadic)
  	{
! 	  if (CPP_PEDANTIC (pfile) && ! macro->syshdr)
  	    cpp_error (pfile, DL_PEDWARN,
  		       "ISO C99 requires rest arguments to be used");
  	  return true;
  	}
  
!       cpp_error (pfile, DL_ERROR,
! 		 "macro \"%s\" requires %u arguments, but only %u given",
! 		 NODE_NAME (node), macro->paramc, argc);
      }
    else
!     cpp_error (pfile, DL_ERROR,
! 	       "macro \"%s\" passed %u arguments, but takes just %u",
! 	       NODE_NAME (node), argc, macro->paramc);
  
    return false;
  }
--- 542,563 ----
  
        if (argc + 1 == macro->paramc && macro->variadic)
  	{
! 	  if (CPP_PEDANTIC (pfile) && ! macro->syshdr && !silent)
  	    cpp_error (pfile, DL_PEDWARN,
  		       "ISO C99 requires rest arguments to be used");
  	  return true;
  	}
  
!       if (!silent)
! 	cpp_error (pfile, DL_ERROR,
! 		   "macro \"%s\" requires %u arguments, but only %u given",
! 		   NODE_NAME (node), macro->paramc, argc);
      }
    else
!     if (!silent)
!       cpp_error (pfile, DL_ERROR,
! 		 "macro \"%s\" passed %u arguments, but takes just %u",
! 		 NODE_NAME (node), argc, macro->paramc);
  
    return false;
  }
*************** collect_args (pfile, node)
*** 674,680 ****
        /* A single empty argument is counted as no argument.  */
        if (argc == 1 && macro->paramc == 0 && args[0].count == 0)
  	argc = 0;
!       if (_cpp_arguments_ok (pfile, macro, node, argc))
  	{
  	  /* GCC has special semantics for , ## b where b is a varargs
  	     parameter: we remove the comma if b was omitted entirely.
--- 677,683 ----
        /* A single empty argument is counted as no argument.  */
        if (argc == 1 && macro->paramc == 0 && args[0].count == 0)
  	argc = 0;
!       if (_cpp_arguments_ok (pfile, macro, node, argc, false))
  	{
  	  /* GCC has special semantics for , ## b where b is a varargs
  	     parameter: we remove the comma if b was omitted entirely.
Index: cpptrad.c
===================================================================
RCS file: /cvs/src/gnu/usr.bin/gcc/gcc/cpptrad.c,v
retrieving revision 1.1.1.1
diff -c -p -r1.1.1.1 cpptrad.c
*** cpptrad.c	29 Nov 2003 12:21:52 -0000	1.1.1.1
--- cpptrad.c	29 Nov 2003 15:45:23 -0000
*************** scan_out_logical_line (pfile, macro)
*** 665,671 ****
  		      && out == pfile->out.base + fmacro.offset + 1)
  		    fmacro.argc = 0;
  
! 		  if (_cpp_arguments_ok (pfile, m, fmacro.node, fmacro.argc))
  		    {
  		      /* Remove the macro's invocation from the
  			 output, and push its replacement text.  */
--- 665,671 ----
  		      && out == pfile->out.base + fmacro.offset + 1)
  		    fmacro.argc = 0;
  
! 		  if (_cpp_arguments_ok (pfile, m, fmacro.node, fmacro.argc, true))
  		    {
  		      /* Remove the macro's invocation from the
  			 output, and push its replacement text.  */

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2003-12-07 18:25 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <bqb9lu$m85$2@clipper.ens.fr>
2003-12-07 18:30 ` PATCH: work-around for bug in -traditional-cpp Marc Espie
2003-11-25 15:31 Bug in traditional cpp in gcc 3.3.2 ? Marc Espie
2003-11-25 17:01 ` Andreas Schwab
2003-11-29 18:14   ` PATCH: work-around for bug in -traditional-cpp Marc Espie
2003-11-29 23:11     ` Neil Booth
2003-11-29 23:52       ` Marc Espie

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).