On 06/18/2014 12:59 PM, Basile Starynkevitch wrote:
Hello All,

The following code:

    #include <stdlib.h>
    struct s1_st {
      char* i_name;
      struct s1_st* i_foo;
    };

    void clear_s1 (struct s1_st*s)
    {
      __atomic_store(s->i_name, NULL, __ATOMIC_SEQ_CST);
    }

gives an ICE when compiled (on Debian/Sid/amd64) by GCC 4.8 & 4.9 (I did not 
test it on the trunk yet)

(For some strange reason, probably on my side, I'm not able to change the 
password on bugzilla. So I'm reporting that bug here, sorry for the 
inconvenience).

Cheers.


First, thats an error... the second parameter to __atomic_store must be a pointer to memory, not NULL. We store the contents of that location to s->i_name. Perhaps it was meant to be __atomic_store_n () ?

That doesn't excuse the exception however. Looks like void type has a NULL TYPE_SIZE_UNIT, which causes tree_to_uhwi to segfault. could be fixed with something like this.. try it. I get

a.c: In function ‘clear_s1’:
a.c:9:6: error: size mismatch in argument 2 of ‘__atomic_store’
__atomic_store(s->i_name, NULL, __ATOMIC_SEQ_CST);

Thoroughly untested of course :-)

Andrew



        * c-common,c (get_atomic_generic_size):  Handle pointer to 0 size.

Index: c-family/c-common.c
===================================================================
*** c-family/c-common.c (revision 211758)
--- c-family/c-common.c (working copy)
*************** get_atomic_generic_size (location_t loc,
*** 10462,10467 ****
--- 10462,10468 ----
      {
        int size;
        tree type = TREE_TYPE ((*params)[x]);
+       tree type_size;
        /* __atomic_compare_exchange has a bool in the 4th position, skip it.  
*/
        if (n_param == 6 && x == 3)
          continue;
*************** get_atomic_generic_size (location_t loc,
*** 10471,10477 ****
                    function);
          return 0;
        }
!       size = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (type)));
        if (size != size_0)
        {
          error_at (loc, "size mismatch in argument %d of %qE", x + 1,
--- 10472,10480 ----
                    function);
          return 0;
        }
! 
!       type_size = TYPE_SIZE_UNIT (TREE_TYPE (type));
!       size = type_size ? tree_to_uhwi (type_size) : 0;
        if (size != size_0)
        {
          error_at (loc, "size mismatch in argument %d of %qE", x + 1,

Reply via email to