[llvm-bugs] [Bug 35757] New: Can't initialize an anonymous struct in for loop

via llvm-bugs llvm-bugs at lists.llvm.org
Wed Dec 27 02:09:10 PST 2017


            Bug ID: 35757
           Summary: Can't initialize an anonymous struct in for loop
           Product: clang
           Version: unspecified
          Hardware: Macintosh
                OS: MacOS X
            Status: NEW
          Severity: normal
          Priority: P
         Component: -New Bugs
          Assignee: unassignedclangbugs at nondot.org
          Reporter: bo at bowild.com
                CC: llvm-bugs at lists.llvm.org

When trying to initialize an anonymous struct within a for loop, the following
error is displayed:

     error: declaration of non-local variable in 'for' loop

The error does not occur when using `gcc`.

This was discussed on StackOverflow and recognized as a bug by Microsoft
Virtual Studio's development team (though at the time they decided not to fix
the issue, see the comments in the bug report).

SO discussion:

MVS bug

This issue requires adding struct identifiers to the global namespace where
these can be avoided.

The following example was stripped from an implementation for a dynamic array
(this produces the error):

      #include <stdio.h>

      typedef struct fio_ary_s {
        unsigned long start;
        unsigned long end;
        unsigned long capa;
        void **arry;
      } fio_ary_s;

       * Iterates through the list using a `for` loop.
       * Access the data with `pos.obj` and it's index with `pos.i`. the `pos`
       * variable can be named however you please.
      #define FIO_ARY_FOR(ary, pos)                                            
        for (                                                                  
            struct {                                                           
              unsigned long i;                                                 
              void *obj;                                                       
            } pos = {0, (ary)->arry[(ary)->start]};                            
            (pos.i + (ary)->start) < (ary)->end;                               
            (++pos.i), (pos.obj = (ary)->arry[pos.i + (ary)->start]))

      int main(void) {
        char *static_data[] = {"Hello ", "world"};
        fio_ary_s static_ary = (fio_ary_s){.arry = (void **)static_data, .end =
        FIO_ARY_FOR(&static_ary, pos) {
          printf("index: %lu == %s\n", pos.i, (char *)pos.obj);

        /* code */
        return 0;

Changing the macro to use a non-anonymous struct will work around the issue,
but it will add redundant code as well as litter the namespace:

      struct fio_ary_pos_s {
        unsigned long i;
        void *obj;
      #define FIO_ARY_FOR(ary, pos)                                            
        for (struct fio_ary_pos_s pos = {0, (ary)->arry[(ary)->start]};        
             (pos.i + (ary)->start) < (ary)->end;                              
             (++pos.i), (pos.obj = (ary)->arry[pos.i + (ary)->start]))

You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20171227/787197f9/attachment.html>

More information about the llvm-bugs mailing list