DMD source violates c++11 standards.

Hans W. Uhlig huhlig at gmail.com
Tue May 28 11:22:13 PDT 2013


Prepping a patch for dmd to correct some of the C++11 Correctness 
issues.

I came across this set and am a bit hesitant to change it without 
knowing side effects.

/home/huhlig/Temp/d/ldc/dmd2/struct.c:239:14: error: case value 
evaluates to -1, which cannot be narrowed to type 'structalign_t' 
(aka 'unsigned int')
       [-Wc++11-narrowing]
         case STRUCTALIGN_DEFAULT:
              ^
/home/huhlig/Temp/d/ldc/dmd2/mars.h:308:29: note: expanded from 
macro 'STRUCTALIGN_DEFAULT'
#define STRUCTALIGN_DEFAULT ~0  // magic value means "match 
whatever the underlying C compiler does"

void AggregateDeclaration::alignmember(
         structalign_t alignment,   // struct alignment that is in 
effect
         unsigned size,             // alignment requirement of 
field
         unsigned *poffset)
{
     //printf("alignment = %d, size = %d, offset = 
%d\n",alignment,size,offset);
     switch (alignment)
     {
         case 1:
             // No alignment
             break;

         case STRUCTALIGN_DEFAULT:
         {   /* Must match what the corresponding C compiler's 
default
              * alignment behavior is.
              */
             assert(size != 3);
             unsigned sa = (size == 0 || 8 < size) ? 8 : size;
             *poffset = (*poffset + sa - 1) & ~(sa - 1);
             break;
         }

         default:
             // Align on alignment boundary, which must be a 
positive power of 2
             assert(alignment > 0 && !(alignment & (alignment - 
1)));
             *poffset = (*poffset + alignment - 1) & ~(alignment - 
1);
             break;
     }
}


More information about the Digitalmars-d mailing list