Bug 7029 - preprocessor should ignore #warning with -M
Summary: preprocessor should ignore #warning with -M
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: preprocessor (show other bugs)
Version: unknown
: P3 enhancement
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2002-06-14 04:26 UTC by wolfgang.bangerth
Modified: 2003-07-25 17:33 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description wolfgang.bangerth 2002-06-14 04:26:00 UTC
IMHO, warnings generated by #warning may be omitted when not
actually compiling code, for example when using -M to
generate dependency lists. They seem inappropriate for this
task.

Release:
unknown

Environment:
all

How-To-Repeat:
program> echo "#warning Warn about something" > x.cc
program> gcc -M x.cc 
x.cc:1:2: warning: #warning Warn about something
x.o: x.cc
Comment 1 Zack Weinberg 2002-07-01 14:20:38 UTC
From: Zack Weinberg <zack@codesourcery.com>
To: Neil Booth <neil@daikokuya.co.uk>
Cc: wolfgang.bangerth@iwr.uni-heidelberg.de, gcc-gnats@gcc.gnu.org,
	gcc-bugs@gcc.gnu.org
Subject: Re: preprocessor/7029: preprocessor should ignore #warning with -M
Date: Mon, 1 Jul 2002 14:20:38 -0700

 On Mon, Jul 01, 2002 at 10:04:49PM +0100, Neil Booth wrote:
 > > IMHO, warnings generated by #warning may be omitted when not
 > > actually compiling code, for example when using -M to
 > > generate dependency lists. They seem inappropriate for this
 > > task.
 > > >How-To-Repeat:
 > > program> echo "#warning Warn about something" > x.cc
 > > program> gcc -M x.cc 
 > > x.cc:1:2: warning: #warning Warn about something
 > > x.o: x.cc
 > 
 > Warnings are sent to stderr and the dpendency information isn't; so if
 > you don't want the warnings you are free to pipe stderr to /dev/null.
 > If you still wanted to retain errors but not warnings you can use -w,
 > or check the compiler return code.
 > 
 > So I disagree that there is any reason to change the existing behaviour,
 > and want to close this PR.  Do you agree, Zack?
 
 Well, I think it might be reasonable for -M switches that inhibit
 compilation to imply -w.  Presumably the user will get all the
 warnings in due course as part of the real compilation.
 
 zw

Comment 2 Zack Weinberg 2002-07-01 14:33:20 UTC
From: Zack Weinberg <zack@codesourcery.com>
To: Neil Booth <neil@daikokuya.co.uk>
Cc: wolfgang.bangerth@iwr.uni-heidelberg.de, gcc-gnats@gcc.gnu.org,
	gcc-bugs@gcc.gnu.org
Subject: Re: preprocessor/7029: preprocessor should ignore #warning with -M
Date: Mon, 1 Jul 2002 14:33:20 -0700

 On Mon, Jul 01, 2002 at 10:20:29PM +0100, Neil Booth wrote:
 > Zack Weinberg wrote:-
 > 
 > > > Warnings are sent to stderr and the dpendency information isn't; so if
 > > > you don't want the warnings you are free to pipe stderr to /dev/null.
 > > > If you still wanted to retain errors but not warnings you can use -w,
 > > > or check the compiler return code.
 > > > 
 > > > So I disagree that there is any reason to change the existing behaviour,
 > > > and want to close this PR.  Do you agree, Zack?
 > > 
 > > Well, I think it might be reasonable for -M switches that inhibit
 > > compilation to imply -w.  Presumably the user will get all the
 > > warnings in due course as part of the real compilation.
 > 
 > Fair enough; I'll create a patch.
 
 Thanks.
 
 zw

Comment 3 Zack Weinberg 2002-07-01 15:49:09 UTC
From: Zack Weinberg <zack@codesourcery.com>
To: Neil Booth <neil@daikokuya.co.uk>
Cc: wolfgang.bangerth@iwr.uni-heidelberg.de, gcc-gnats@gcc.gnu.org,
	gcc-patches@gcc.gnu.org
Subject: Re: preprocessor/7029: preprocessor should ignore #warning with -M
Date: Mon, 1 Jul 2002 15:49:09 -0700

 On Mon, Jul 01, 2002 at 10:47:10PM +0100, Neil Booth wrote:
 > +  /* If we're outputting dependencies then inhibit warnings, otherwise
 > +     complain if other -M options have been given.  */
 > +  if (CPP_OPTION (pfile, print_deps))
 > +    CPP_OPTION (pfile, inhibit_warnings) = 1;
 
 This will suppress warnings when -MD or -MF is in use, won't it?  We
 still want them then (since we're proceeding to do the compilation,
 and the user will never see them otherwise).
 
 zw

Comment 4 Neil Booth 2002-07-01 22:04:49 UTC
From: Neil Booth <neil@daikokuya.co.uk>
To: wolfgang.bangerth@iwr.uni-heidelberg.de,
	Zack Weinberg <zack@codesourcery.com>
Cc: gcc-gnats@gcc.gnu.org, gcc-bugs@gcc.gnu.org
Subject: Re: preprocessor/7029: preprocessor should ignore #warning with -M
Date: Mon, 1 Jul 2002 22:04:49 +0100

 > IMHO, warnings generated by #warning may be omitted when not
 > actually compiling code, for example when using -M to
 > generate dependency lists. They seem inappropriate for this
 > task.
 > >How-To-Repeat:
 > program> echo "#warning Warn about something" > x.cc
 > program> gcc -M x.cc 
 > x.cc:1:2: warning: #warning Warn about something
 > x.o: x.cc
 
 Warnings are sent to stderr and the dpendency information isn't; so if
 you don't want the warnings you are free to pipe stderr to /dev/null.
 If you still wanted to retain errors but not warnings you can use -w,
 or check the compiler return code.
 
 So I disagree that there is any reason to change the existing behaviour,
 and want to close this PR.  Do you agree, Zack?
 
 Neil.

Comment 5 Neil Booth 2002-07-01 22:20:29 UTC
From: Neil Booth <neil@daikokuya.co.uk>
To: Zack Weinberg <zack@codesourcery.com>
Cc: wolfgang.bangerth@iwr.uni-heidelberg.de, gcc-gnats@gcc.gnu.org,
	gcc-bugs@gcc.gnu.org
Subject: Re: preprocessor/7029: preprocessor should ignore #warning with -M
Date: Mon, 1 Jul 2002 22:20:29 +0100

 Zack Weinberg wrote:-
 
 > > Warnings are sent to stderr and the dpendency information isn't; so if
 > > you don't want the warnings you are free to pipe stderr to /dev/null.
 > > If you still wanted to retain errors but not warnings you can use -w,
 > > or check the compiler return code.
 > > 
 > > So I disagree that there is any reason to change the existing behaviour,
 > > and want to close this PR.  Do you agree, Zack?
 > 
 > Well, I think it might be reasonable for -M switches that inhibit
 > compilation to imply -w.  Presumably the user will get all the
 > warnings in due course as part of the real compilation.
 
 Fair enough; I'll create a patch.
 
 Neil.

Comment 6 Neil Booth 2002-07-01 22:47:10 UTC
From: Neil Booth <neil@daikokuya.co.uk>
To: Zack Weinberg <zack@codesourcery.com>
Cc: wolfgang.bangerth@iwr.uni-heidelberg.de, gcc-gnats@gcc.gnu.org,
	gcc-patches@gcc.gnu.org
Subject: Re: preprocessor/7029: preprocessor should ignore #warning with -M
Date: Mon, 1 Jul 2002 22:47:10 +0100

 Neil Booth wrote:-
 
 > > Well, I think it might be reasonable for -M switches that inhibit
 > > compilation to imply -w.  Presumably the user will get all the
 > > warnings in due course as part of the real compilation.
 > 
 > Fair enough; I'll create a patch.
 
 Here it is.  I'll apply it after a successful bootstrap.  I took
 the opportunity to clarify some comments and move output
 suppression to what I think is a better place than the option handler.
 
 Neil.
 
 	* cppinit.c (cpp_handle_option): Move suppression of output
 	for -M and -MM to...
 	(cpp_post_options): ...here.  If we're outputting dependencies,
 	suppress warnings with an implicit "-w".
 doc:
 	* cppopts.texi: Update.
 testsuite:
 	* gcc.dg/cpp/cmdlne-M.c: New test.
 
 Index: cppinit.c
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/cppinit.c,v
 retrieving revision 1.242
 diff -u -p -r1.242 cppinit.c
 --- cppinit.c	19 Jun 2002 05:40:04 -0000	1.242
 +++ cppinit.c	1 Jul 2002 21:44:46 -0000
 @@ -1531,11 +1531,9 @@ cpp_handle_option (pfile, argc, argv)
  	     depends on this.  Preprocessed output occurs if -MD, -MMD
  	     or environment var dependency generation is used.  */
  	  CPP_OPTION (pfile, print_deps) = 2;
 -	  CPP_OPTION (pfile, no_output) = 1;
  	  break;
  	case OPT_MM:
  	  CPP_OPTION (pfile, print_deps) = 1;
 -	  CPP_OPTION (pfile, no_output) = 1;
  	  break;
  	case OPT_MF:
  	  CPP_OPTION (pfile, deps_file) = arg;
 @@ -1794,14 +1792,14 @@ cpp_post_options (pfile)
    if (CPP_OPTION (pfile, traditional))
      CPP_OPTION (pfile, show_column) = 0;
  
 -  /* -dM makes no normal output.  This is set here so that -dM -dD
 -     works as expected.  */
 -  if (CPP_OPTION (pfile, dump_macros) == dump_only)
 +  /* -dM and dependencies suppress normal output; do it here so that
 +     the last -d[MDN] switch overrides earlier ones.  */
 +  if (CPP_OPTION (pfile, dump_macros) == dump_only
 +      || CPP_OPTION (pfile, print_deps))
      CPP_OPTION (pfile, no_output) = 1;
  
 -  /* Disable -dD, -dN and -dI if we should make no normal output
 -     (such as with -M). Allow -M -dM since some software relies on
 -     this.  */
 +  /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
 +     -dM since at least glibc relies on -M -dM to work.  */
    if (CPP_OPTION (pfile, no_output))
      {
        if (CPP_OPTION (pfile, dump_macros) != dump_only)
 @@ -1809,17 +1807,17 @@ cpp_post_options (pfile)
        CPP_OPTION (pfile, dump_includes) = 0;
      }
  
 -  /* We need to do this after option processing and before
 -     cpp_start_read, as cppmain.c relies on the options->no_output to
 -     set its callbacks correctly before calling cpp_start_read.  */
 +  /* Intialize, and check environment variables for, dependency
 +     output.  */
    init_dependency_output (pfile);
  
 -  /* After checking the environment variables, check if -M or -MM has
 -     not been specified, but other -M options have.  */
 -  if (CPP_OPTION (pfile, print_deps) == 0 &&
 -      (CPP_OPTION (pfile, print_deps_missing_files)
 -       || CPP_OPTION (pfile, deps_file)
 -       || CPP_OPTION (pfile, deps_phony_targets)))
 +  /* If we're outputting dependencies then inhibit warnings, otherwise
 +     complain if other -M options have been given.  */
 +  if (CPP_OPTION (pfile, print_deps))
 +    CPP_OPTION (pfile, inhibit_warnings) = 1;
 +  else if (CPP_OPTION (pfile, print_deps_missing_files)
 +	   || CPP_OPTION (pfile, deps_file)
 +	   || CPP_OPTION (pfile, deps_phony_targets))
      cpp_error (pfile, DL_ERROR,
  	       "you must additionally specify either -M or -MM");
  }
 Index: testsuite/gcc.dg/cpp/cmdlne-M.c
 ===================================================================
 RCS file: testsuite/gcc.dg/cpp/cmdlne-M.c
 diff -N testsuite/gcc.dg/cpp/cmdlne-M.c
 --- /dev/null	1 Jan 1970 00:00:00 -0000
 +++ testsuite/gcc.dg/cpp/cmdlne-M.c	1 Jul 2002 21:44:46 -0000
 @@ -0,0 +1,8 @@
 +/* Copyright (C) 2002 Free Software Foundation, Inc.  */
 +
 +/* { dg-do preprocess } */
 +/* { dg-options "-M" } */
 +
 +/* Test that dependency output suppresses warnings by implying -w.  */
 +
 +#warning bogus /* { dg-bogus "warning" "warning not suppressed" } */
 Index: doc/cppopts.texi
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/doc/cppopts.texi,v
 retrieving revision 1.6
 diff -u -p -r1.6 cppopts.texi
 --- doc/cppopts.texi	8 May 2002 21:21:19 -0000	1.6
 +++ doc/cppopts.texi	1 Jul 2002 21:44:46 -0000
 @@ -178,7 +178,8 @@ rules you should explicitly specify the 
  @env{DEPENDENCIES_OUTPUT} (@pxref{Environment Variables}).  Debug output
  will still be sent to the regular output stream as normal.
  
 -Passing @option{-M} to the driver implies @option{-E}.
 +Passing @option{-M} to the driver implies @option{-E}, and suppresses
 +warnings with an implicit @option{-w}.
  
  @item -MM
  @opindex MM

Comment 7 Neil Booth 2002-07-02 06:48:15 UTC
From: Neil Booth <neil@daikokuya.co.uk>
To: Zack Weinberg <zack@codesourcery.com>
Cc: wolfgang.bangerth@iwr.uni-heidelberg.de, gcc-gnats@gcc.gnu.org,
	gcc-patches@gcc.gnu.org
Subject: Re: preprocessor/7029: preprocessor should ignore #warning with -M
Date: Tue, 2 Jul 2002 06:48:15 +0100

 Zack Weinberg wrote:-
 
 > On Mon, Jul 01, 2002 at 10:47:10PM +0100, Neil Booth wrote:
 > > +  /* If we're outputting dependencies then inhibit warnings, otherwise
 > > +     complain if other -M options have been given.  */
 > > +  if (CPP_OPTION (pfile, print_deps))
 > > +    CPP_OPTION (pfile, inhibit_warnings) = 1;
 > 
 > This will suppress warnings when -MD or -MF is in use, won't it?  We
 > still want them then (since we're proceeding to do the compilation,
 > and the user will never see them otherwise).
 
 Damn, yes, this area is a right minefield.  The sad thing is that the
 patch bootstrapped without regressions even though the move of
 no_output suffers the same problem.  We have poor coverage of -M
 and friends still, despite Jakub's new testcases.
 
 Neil.
 
 	* cppinit.c (cpp_handle_option):  Suppress warnings with an
 	implicit "-w" for "-M" and "-MM".
 doc:
 	* cppopts.texi: Update.
 testsuite:
 	* gcc.dg/cpp/cmdlne-M.c: New test.
 
 Index: cppinit.c
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/cppinit.c,v
 retrieving revision 1.242
 diff -u -p -r1.242 cppinit.c
 --- cppinit.c	19 Jun 2002 05:40:04 -0000	1.242
 +++ cppinit.c	2 Jul 2002 05:50:59 -0000
 @@ -1532,10 +1532,12 @@ cpp_handle_option (pfile, argc, argv)
  	     or environment var dependency generation is used.  */
  	  CPP_OPTION (pfile, print_deps) = 2;
  	  CPP_OPTION (pfile, no_output) = 1;
 +	  CPP_OPTION (pfile, inhibit_warnings) = 1;
  	  break;
  	case OPT_MM:
  	  CPP_OPTION (pfile, print_deps) = 1;
  	  CPP_OPTION (pfile, no_output) = 1;
 +	  CPP_OPTION (pfile, inhibit_warnings) = 1;
  	  break;
  	case OPT_MF:
  	  CPP_OPTION (pfile, deps_file) = arg;
 @@ -1794,14 +1796,13 @@ cpp_post_options (pfile)
    if (CPP_OPTION (pfile, traditional))
      CPP_OPTION (pfile, show_column) = 0;
  
 -  /* -dM makes no normal output.  This is set here so that -dM -dD
 -     works as expected.  */
 +  /* -dM and dependencies suppress normal output; do it here so that
 +     the last -d[MDN] switch overrides earlier ones.  */
    if (CPP_OPTION (pfile, dump_macros) == dump_only)
      CPP_OPTION (pfile, no_output) = 1;
  
 -  /* Disable -dD, -dN and -dI if we should make no normal output
 -     (such as with -M). Allow -M -dM since some software relies on
 -     this.  */
 +  /* Disable -dD, -dN and -dI if normal output is suppressed.  Allow
 +     -dM since at least glibc relies on -M -dM to work.  */
    if (CPP_OPTION (pfile, no_output))
      {
        if (CPP_OPTION (pfile, dump_macros) != dump_only)
 @@ -1809,17 +1810,16 @@ cpp_post_options (pfile)
        CPP_OPTION (pfile, dump_includes) = 0;
      }
  
 -  /* We need to do this after option processing and before
 -     cpp_start_read, as cppmain.c relies on the options->no_output to
 -     set its callbacks correctly before calling cpp_start_read.  */
 +  /* Intialize, and check environment variables for, dependency
 +     output.  */
    init_dependency_output (pfile);
  
 -  /* After checking the environment variables, check if -M or -MM has
 -     not been specified, but other -M options have.  */
 -  if (CPP_OPTION (pfile, print_deps) == 0 &&
 -      (CPP_OPTION (pfile, print_deps_missing_files)
 -       || CPP_OPTION (pfile, deps_file)
 -       || CPP_OPTION (pfile, deps_phony_targets)))
 +  /* If we're not outputting dependencies, complain if other -M
 +     options have been given.  */
 +  if (!CPP_OPTION (pfile, print_deps)
 +      && (CPP_OPTION (pfile, print_deps_missing_files)
 +	  || CPP_OPTION (pfile, deps_file)
 +	  || CPP_OPTION (pfile, deps_phony_targets))
      cpp_error (pfile, DL_ERROR,
  	       "you must additionally specify either -M or -MM");
  }
 Index: testsuite/gcc.dg/cpp/cmdlne-M.c
 ===================================================================
 RCS file: testsuite/gcc.dg/cpp/cmdlne-M.c
 diff -N testsuite/gcc.dg/cpp/cmdlne-M.c
 --- /dev/null	1 Jan 1970 00:00:00 -0000
 +++ testsuite/gcc.dg/cpp/cmdlne-M.c	2 Jul 2002 05:50:59 -0000
 @@ -0,0 +1,8 @@
 +/* Copyright (C) 2002 Free Software Foundation, Inc.  */
 +
 +/* { dg-do preprocess } */
 +/* { dg-options "-M" } */
 +
 +/* Test that dependency output suppresses warnings by implying -w.  */
 +
 +#warning bogus /* { dg-bogus "warning" "warning not suppressed" } */
 Index: doc/cppopts.texi
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/doc/cppopts.texi,v
 retrieving revision 1.6
 diff -u -p -r1.6 cppopts.texi
 --- doc/cppopts.texi	8 May 2002 21:21:19 -0000	1.6
 +++ doc/cppopts.texi	2 Jul 2002 05:50:59 -0000
 @@ -178,7 +178,8 @@ rules you should explicitly specify the 
  @env{DEPENDENCIES_OUTPUT} (@pxref{Environment Variables}).  Debug output
  will still be sent to the regular output stream as normal.
  
 -Passing @option{-M} to the driver implies @option{-E}.
 +Passing @option{-M} to the driver implies @option{-E}, and suppresses
 +warnings with an implicit @option{-w}.
  
  @item -MM
  @opindex MM
Comment 8 Neil Booth 2002-07-02 15:34:59 UTC
State-Changed-From-To: open->closed
State-Changed-Why: Fixed for 3.2.