Bug 15885 - [4.0 Regression] wrong va_start warning (and code)
Summary: [4.0 Regression] wrong va_start warning (and code)
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.0.0
: P3 critical
Target Milestone: 4.0.0
Assignee: Jason Merrill
URL:
Keywords: diagnostic, wrong-code
: 16041 (view as bug list)
Depends on:
Blocks:
 
Reported: 2004-06-08 23:38 UTC by snyder
Modified: 2006-02-10 22:18 UTC (History)
5 users (show)

See Also:
Host:
Target:
Build:
Known to work: 3.4.0
Known to fail: 4.0.0
Last reconfirmed: 2004-06-08 23:45:51


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description snyder 2004-06-08 23:38:41 UTC
When compiling the source below, gcc produces the warnings

x.cc:8: warning: second parameter of `va_start' not last named argument
x.cc:8: warning: second parameter of `va_start' not last named argument
 
which is at best misleading, as the second argument of va_start actually
is the last named argument.  gcc appears to give this warning in this
case if the argument is also passed by reference somewhere in the
function, as it is here in the call to bar().

I don't have my copy of the standard handy, so i'm not completely sure
that there isn't a restriction about taking a reference to an argument
used in va_start.  However, even if this test case is actually not valid,
the warning message should be changed to reflect the true problem.

Environment:
System: Linux karma 2.6.6 #15 Thu May 13 15:07:54 EDT 2004 i686 i686 i386 GNU/Linux
Architecture: i686

	<machine, os, target, libraries (multiple lines)>
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with: /home/sss/gcc/gcc/configure --prefix=/usr/local/gcc --enable-threads=posix --enable-long-long --enable-languages=c,c++,f95

How-To-Repeat:

Compile the following:

----------------------------
#include <cstdarg>

void bar(const int&);

void foo (int x, ...)
{
  va_list ap;
  va_start (ap, x);
  bar(x);
}

----------------------------
Comment 1 snyder 2004-06-08 23:38:41 UTC
Fix:
	<how to correct or work around the problem, if known (multiple lines)>
Comment 2 Andrew Pinski 2004-06-08 23:45:49 UTC
Confirmed.
Here is another example (but this time in C):
#include <stdarg.h>

void bar(int*);

void foo (int x, ...)
{
  va_list ap;
  va_start (ap, x);
  bar(&x);
}

Note this causes wrong code.
Comment 3 Andrew Pinski 2004-06-08 23:52:43 UTC
No this is valid code, the problem is that the front-end marks the decl (x) as TREE_ADDRESSABLE, so 
when the gimplify comes along it loads the decl into another tempary decl which causes this warning 
but this also causes wrong code too.
Comment 4 Andrew Pinski 2004-06-09 00:38:44 UTC
Note this also the reason why gcc.dg/altivec-varargs-1.c  fails on powerpc-apple-darwin.
Comment 5 Andrew Pinski 2004-06-09 16:04:49 UTC
Jason do you want to look at this one, it is related to gimplifing __builtin_va_start
Comment 6 Andrew Pinski 2004-06-17 22:42:32 UTC
*** Bug 16041 has been marked as a duplicate of this bug. ***
Comment 7 GCC Commits 2004-07-15 21:50:55 UTC
Subject: Bug 15885

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	jason@gcc.gnu.org	2004-07-15 21:50:51

Modified files:
	gcc            : ChangeLog gimplify.c 
	gcc/cp         : ChangeLog cp-lang.c 

Log message:
	* cp-lang.c (cxx_types_compatible_p): To the middle-end,
	references and pointers are compatible.
	
	PR middle-end/15885
	* gimplify.c (gimplify_arg): New fn, split out from...
	(gimplify_call_expr): Here.  Special-case BUILT_IN_VA_START.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.4550&r2=2.4551
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/gimplify.c.diff?cvsroot=gcc&r1=2.47&r2=2.48
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&r1=1.4204&r2=1.4205
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/cp-lang.c.diff?cvsroot=gcc&r1=1.85&r2=1.86

Comment 8 Andrew Pinski 2004-07-15 22:08:20 UTC
Fixed.