http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52215

Richard Guenther <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rth at gcc dot gnu.org
   Target Milestone|---                         |4.7.0
            Summary|__atomic_compare_exchange_n |[4.7 Regression]
                   |for enumeration type        |__atomic_compare_exchange_n
                   |changes signature with -m32 |for enumeration type
                   |                            |changes signature with -m32

--- Comment #5 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-02-13 
11:28:04 UTC ---
DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N,
                  "__atomic_compare_exchange_n",
                  BT_FN_VOID_VAR, ATTR_NOTHROW_LEAF_LIST)

thus it is a variadic function.  But sync_resolve_params () does

      /* Only convert parameters if the size is appropriate with new format
         sync routines.  */
      if (orig_format
          || tree_int_cst_equal (TYPE_SIZE (ptype), TYPE_SIZE (arg_type)))
        {
          /* Ideally for the first conversion we'd use convert_for_assignment
             so that we get warnings for anything that doesn't match the
pointer
             type.  This isn't portable across the C and C++ front ends atm. 
*/
          val = VEC_index (tree, params, parmnum);
          val = convert (ptype, val);
          val = convert (arg_type, val);
          VEC_replace (tree, params, parmnum, val);

where we probably should convert to an integer type of the same size as
arg_type first, before converting to a pointer?

Reply via email to