Closed Bug 37364 Opened 24 years ago Closed 24 years ago

ProxyJNI.cpp does not build with recent GCC snapshots

Categories

(Core Graveyard :: Java: OJI, defect, P3)

x86
Linux
defect

Tracking

(Not tracked)

VERIFIED DUPLICATE of bug 39050

People

(Reporter: green, Assigned: blackconnect)

References

Details

ProxyJNI.cpp does not build with recent snapshots of GCC.
This has to do with how va_args is being used.
It's not very nice, but here's a patch.


Index: ProxyJNI.cpp
===================================================================
RCS file: /cvsroot/mozilla/modules/oji/src/ProxyJNI.cpp,v
retrieving revision 1.15
diff -u -r1.15 ProxyJNI.cpp
--- ProxyJNI.cpp        2000/01/05 01:41:06     1.15
+++ ProxyJNI.cpp        2000/04/27 04:16:25
@@ -182,17 +182,19 @@
                     		case jobject_type:
					jargs[i].l = va_arg(args, jobject);
					break;
+                               // These next four types are promoted to `int'
when
+                               // passed through `...'.
				case jboolean_type:
-                                       jargs[i].z = va_arg(args, jboolean);
+                                       jargs[i].z = va_arg(args, int);
					break;
				case jbyte_type:
-                                       jargs[i].b = va_arg(args, jbyte);
+                                       jargs[i].b = va_arg(args, int);
					break;
				case jchar_type:
-                                       jargs[i].b = va_arg(args, jbyte);
+                                       jargs[i].b = va_arg(args, int);
					break;
				case jshort_type:
-                                       jargs[i].s = va_arg(args, jshort);
+                                       jargs[i].s = va_arg(args, int);
					break;
				case jint_type:
					jargs[i].i = va_arg(args, jint);
@@ -200,8 +202,10 @@
                    		case jlong_type:
					jargs[i].j = va_arg(args, jlong);
					break;
+                               // `jfloat's are promoted to `double' when
passed
+                               // through `...'.
				case jfloat_type:
-                                       jargs[i].f = va_arg(args, jfloat);
+                                       jargs[i].f = va_arg(args, double);
					break;
				case jdouble_type:
					jargs[i].d = va_arg(args, jdouble);
I was not able to reproduce this bug on solaris 2.6
using gcc2.95.2 and gcc 2.96 20000427 

I can reproduce it on linux using gcc 2.96 20000428 
(I got gcc from anoncvs.cygnus.com)

I'v found this comment in lib/gcc-lib/i686-pc-linux-gnu/2.96/include/stdarg.h
--
/* Note that the type used in va_arg is supposed to match the
   actual type **after default promotions**.
   Thus, va_arg (..., short) is not valid.  */
--

I am not sure I understand what is "actual type" and what is "default
promotions"

I am getting this bug.
Status: UNCONFIRMED → NEW
Ever confirmed: true
I am gonna handle this bug.
Assignee: drapeau → idk
Hi,

why do you think that this is mozilla bug?
Is not it gcc bug?



comp.lang.c faq:

15.10: I have a varargs function which accepts a float parameter.  Why isn't
  
   va_arg(argp, float)
  
working?

In the variable-length part of variable-length argument lists, the old
"default argument promotions" apply: arguments of type float are
always promoted (widened) to type double, and types char and short int
are promoted to int.  Therefore, it is never correct to invoke
va_arg(argp, float); instead you should always use va_arg(argp,
double).  Similarly, use va_arg(argp, int) to retrieve arguments which
were originally char, short, or int.  (For analogous reasons, the last
"fixed" argument, as handed to va_start(), should not be widenable.)
See also questions 11.3 and 15.2.
  
 References: ANSI Sec. 3.3.2.2; ISO Sec. 6.3.2.2; Rationale
 Sec. 4.8.1.2; H&S Sec. 11.4 p. 297.



I should add that my proposed patch is only valid for 32-bit systems.
You'll also have to deal with jint on 64-bit systems.
Status: NEW → ASSIGNED
*** Bug 40937 has been marked as a duplicate of this bug. ***

*** This bug has been marked as a duplicate of 39050 ***
Status: ASSIGNED → RESOLVED
Closed: 24 years ago
Resolution: --- → DUPLICATE
Status: RESOLVED → VERIFIED
Verified
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.