Bug #11790 closed
[PATCH] ANSI alias rules fix
Added by Zarko (Zarko Todorovski) almost 11 years ago.
Updated almost 11 years ago.
Description
line 70 in file regparse.h:
#define SET_NTYPE(node, ntype) (node)->u.base.type = (ntype)
needs to be changed to conform with ANSI alias rules
Line 70 as it is can lead to errors in compiling in regparse.c
line 1143 : node = ( Node * ) FreeNodeList ;
line 1144 : FreeNodeList = FreeNodeList -> next ;
line 1581 : ( node ) -> u . base . type = ( 0 );
where during compiling line 1581 can be moved ahead of line 1144 since under ANSI aliasing rules, the compiler determines that the statement of "(node)->u.base.type = (0);" does not affect the value of FreeNodeList.
Proposed change in patch is in file regparse.h:
-#define SET_NTYPE(node, ntype) (node)->u.base.type = (ntype)
+#define SET_NTYPE(node, ntype) {int value = ntype; memcpy(&((node)->u.base.type), &value, sizeof((node)->u.base.type));}
Files
Description updated (diff )
Does CAS work?
/* THREAD_ATOMIC_START; */
{
FreeNode * n = FreeNodeList , * n0 ;
while ( IS_NOT_NULL ( n ) && ( n0 = ATOMIC_PTR_CAS ( FreeNodeList , n , n -> next )) != n )
n = n0 ;
if ( IS_NOT_NULL ( n )) return ( Node * ) n ;
}
/* THREAD_ATOMIC_END; */
Status changed from Open to Closed
Applied in changeset r52999.
regparse.h: ANSI alias rule fix
regparse.h (SET_NTYPE): get rid of breaking strict aliasing.
patch by Zarko Todorovski in [ruby-core:71953] . [Bug #11790 ]
Related to Misc #11795 : [PATCH] get rid of breaking strict alias for XL compiler added
Also available in: PDF
Atom