diff options
author | Richard Stallman <rms@gnu.org> | 1992-06-22 08:20:24 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1992-06-22 08:20:24 +0000 |
commit | 5c96a03732c08e298766858d9167a4c91aae0ab7 (patch) | |
tree | 2e847ae2ed7611f3d265782b957a91e5942e418f | |
parent | 5352b11a957b76eb6292bf20b9f4d4ab6a8e2e4e (diff) | |
download | gcc-5c96a03732c08e298766858d9167a4c91aae0ab7.zip gcc-5c96a03732c08e298766858d9167a4c91aae0ab7.tar.gz gcc-5c96a03732c08e298766858d9167a4c91aae0ab7.tar.bz2 |
*** empty log message ***
From-SVN: r1233
-rw-r--r-- | gcc/ginclude/va-sparc.h | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/ginclude/va-sparc.h b/gcc/ginclude/va-sparc.h index e199e1c..2afc3c4 100644 --- a/gcc/ginclude/va-sparc.h +++ b/gcc/ginclude/va-sparc.h @@ -48,6 +48,8 @@ typedef void * __va___list; passed by invisible reference. ??? RECORD_TYPE args passed in the stack are made to be word-aligned; for an aggregate that is not word-aligned, we advance the pointer to the first non-reg slot. */ +/* We don't declare the union member `d' to have type TYPE + because that would lose in C++ if TYPE has a constructor. */ #define va_arg(pvar,TYPE) \ __extension__ \ ({ TYPE __va_temp; \ @@ -55,10 +57,10 @@ __extension__ \ ? ((pvar) += __va_rounded_size (TYPE *), \ **(TYPE **) ((pvar) - __va_rounded_size (TYPE *))) \ : __va_rounded_size (TYPE) == 8 \ - ? ({ union {TYPE d; int i[2];} u; \ - u.i[0] = ((int *) (pvar))[0]; \ - u.i[1] = ((int *) (pvar))[1]; \ + ? ({ union {char __d[sizeof (TYPE)]; int __i[2];} __u; \ + __u.__i[0] = ((int *) (pvar))[0]; \ + __u.__i[1] = ((int *) (pvar))[1]; \ (pvar) += 8; \ - u.d; }) \ + *(TYPE *)__u.__d; }) \ : ((pvar) += __va_rounded_size (TYPE), \ *((TYPE *) ((pvar) - __va_rounded_size (TYPE)))));}) |