struct SwitchRange and C++ One Definition Rule [-Wodr]

Kim Barrett kim.barrett at oracle.com
Fri Jan 3 19:12:52 UTC 2020


> On Jan 3, 2020, at 10:49 AM, Baesken, Matthias <matthias.baesken at sap.com> wrote:
> 
> Hello,  when  experimenting  with  gcc8  and   the -flto compiler flag I was running into these  warnings  in the c1  coding :
>  
>  
> /open_jdk/jdk_3/jdk/src/hotspot/share/c1/c1_LIRGenerator.hpp:50:7: warning: type 'struct SwitchRange' violates the C++ One Definition Rule [-Wodr]
> class SwitchRange: public CompilationResourceObj {
>        ^
> /open_jdk/jdk_3/jdk/src/hotspot/share/opto/parse2.cpp:319: note: a different type is defined in another translation unit
> class SwitchRange : public StackObj {
>  
> /usr/work/d040975/open_jdk/jdk_3/jdk/src/hotspot/share/c1/c1_LIRGenerator.hpp:52:7: note: the first difference of corresponding definitions is field '_low_key'
>    int _low_key;
>        ^
> /open_jdk/jdk_3/jdk/src/hotspot/share/opto/parse2.cpp:321: note: a field with different name is defined in another translation unit
>    jint _lo;                     // inclusive lower limit
>  
>  
>  
> Do  you think this should be fixed ( renaming  one SwitchRange  ) ?
> 

> Martin suggested that  even without  flto added   it could be problematic .

Yes, please file a bug and let's get this fixed quickly.  This sort of thing can lead
to really weird looking problems, like using the same vtable (which one picked
“at random”) for instances of both classes.



More information about the hotspot-compiler-dev mailing list