This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
constructs like: va_start(ap,x); if ( sizeof(short) < sizeof(int) ) res = va_arg(ap,int); else res = va_arg(ap,short); /* meaningless on 32 bit machines */ va_end(ap); the current gcc 3.2 compiler will embed a trap instruction (and emit a warning) that will cause the target program to crash (if executed) for this syntactically right but meaningless construct. we find this counter productive, because the developper may not be scanning all the warnings and therefore may not be aware of the problem, which may reach the end user before being discovered causing grief and unnecessary delays and efforts. this patch to reverses the situation to what it was in gcc 3.0 and 3.1 until April 2002, that is: compilation error (see http://gcc.gnu.org/ml/gcc-bugs/2002-03/msg01291.html ) . This patch may be of interest for people who agree with (or need to enforce) the above the patch does not propose a new option, it just changes the behavior of the compiler for the va_arg problem, the patch does not invalidate any other production of the trap instruction within the compiler, it is applicable to gcc 3.2. Jose ---------- diff -ru gcc/builtins.c gcc/builtins.c --- builtins.c 2002-03-31 14:31:55.000000000 +0300 +++ builtins.c 2002-11-13 13:20:12.000000000 +0200 @@ -3099,25 +3099,16 @@ && DECL_NAME (TYPE_NAME (promoted_type))) pname = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (promoted_type))); } - - /* Unfortunately, this is merely undefined, rather than a constraint - violation, so we cannot make this an error. If this call is never - executed, the program is still strictly conforming. */ - warning ("`%s' is promoted to `%s' when passed through `...'", + /* The best way to handle that is to generate an error */ + error ("`%s' is promoted to `%s' when passed through `...'", name, pname); if (! gave_help) { gave_help = true; - warning ("(so you should pass `%s' not `%s' to `va_arg')", + error ("(so you should pass `%s' not `%s' to `va_arg')", pname, name); } - /* We can, however, treat "undefined" any way we please. - Call abort to encourage the user to fix the program. */ - expand_builtin_trap (); - - /* This is dead code, but go ahead and finish so that the - mode of the result comes out right. */ addr = const0_rtx; } else
Attachment:
gcc_va_arg_error.patch
Description: Binary data
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |