From: Shugo Maeda Date: 2012-12-11T15:21:40+09:00 Subject: [ruby-dev:46726] Re: some warnings compiled with gcc 4.6.3 前田です。 2012年12月11日 15:01 Shugo Maeda : > これ、GC対策なので設定だけして参照しないのは意図どおりなんですよね? > 以下のように警告を抑制してしまってはまずいでしょうか? > > --- a/ext/bigdecimal/extconf.rb > +++ b/ext/bigdecimal/extconf.rb > @@ -3,4 +3,8 @@ require 'mkmf' > have_func("labs", "stdlib.h") > have_func("llabs", "stdlib.h") > > +if CONFIG["GCC"] == "yes" > + $warnflags += " -Wno-unused-but-set-variable" > +end > + > create_makefile('bigdecimal') これだと古いgccでまずいのでこんな感じですかね --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -59,8 +59,18 @@ static ID id_floor; static ID id_to_r; static ID id_eq; +#define GCC_VERSION_SINCE(major, minor, patchlevel) \ + (defined(__GNUC__) && !defined(__INTEL_COMPILER) && \ + ((__GNUC__ > (major)) || \ + (__GNUC__ == (major) && __GNUC_MINOR__ > (minor)) || \ + (__GNUC__ == (major) && __GNUC_MINOR__ == (minor) && __GNUC_PATCHLEVEL__ >= (patchlevel)))) + /* MACRO's to guard objects from GC by keeping them in stack */ +#if GCC_VERSION_SINCE(4,3,0) +#define ENTER(n) volatile VALUE vStack[n] __attribute__ ((unused));int iStack=0 +#else #define ENTER(n) volatile VALUE vStack[n];int iStack=0 +#endif #define PUSH(x) vStack[iStack++] = (VALUE)(x); #define SAVE(p) PUSH(p->obj); #define GUARD_OBJ(p,y) {p=y;SAVE(p);} -- Shugo Maeda