https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103954
--- Comment #2 from Ming Zhi <woodhead99 at gmail dot com> --- thanks for your great answer! I did not know the effect of strict aliasing till today. It looks I need to update my knowledge base about c++ right now. Get Outlook for Android<https://aka.ms/AAb9ysg> ________________________________ From: pinskia at gcc dot gnu.org <gcc-bugzi...@gcc.gnu.org> Sent: Monday, January 10, 2022 12:22:24 AM To: woodhea...@gmail.com <woodhea...@gmail.com> Subject: [Bug c++/103954] GCC did not generate correct code for template function with O2 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103954 Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |INVALID Status|UNCONFIRMED |RESOLVED --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- enum EnumSeriProto : guint32 { seriNone = 0, seriRidl = 1, seriPython = 2, seriJava = 3, seriInvalid = 4 }; .... EnumSeriProto dwSeriProto = seriNone; ret = GetSeriProto( pResp, dwSeriProto ); ... return oCfg.GetIntProp( propSeriProto, ( guint32& )dwSeriProto ); ... gint32 GetIntProp( gint32 iProp, guint32& val ) const { return GetPrimProp( iProp, val ); } ... template< typename PrimType, ... > gint32 GetPrimProp( gint32 iProp, PrimType& val ) const { gint32 ret = 0; if( m_pConstCfg == nullptr ) return - # 1212 "/usr/local/include/rpcf/configdb.h" 3 4 14 # 1212 "/usr/local/include/rpcf/configdb.h" ; auto pdb2 = static_cast< const CConfigDb2* const >( m_pConstCfg ); do{ const Variant* p = pdb2->GetPropertyPtr( iProp ); if( p == nullptr ) { ret = - # 1220 "/usr/local/include/rpcf/configdb.h" 3 4 2 # 1220 "/usr/local/include/rpcf/configdb.h" ; break; } val = *p; }while( 0 ); return ret; } enum types don't alias the underlaying type and therefore this code is undefined at runtime. Use Either a memcpy (or an union) inside GetSeriProto or use -fno-strict-aliasing. -- You are receiving this mail because: You reported the bug.