Changeset 823
- Timestamp:
- 12/27/10 23:23:34 (14 years ago)
- Files:
-
- branches/dmd-1.x/src/todt.c (modified) (2 diffs)
- trunk/src/todt.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/todt.c
r745 r823 126 126 if (k == dts.dim) // didn't find any overlap 127 127 { 128 128 v->type->toDt(&d); 129 129 break; 130 130 } 131 131 VarDeclaration *v2 = (VarDeclaration *)ad->fields.data[k]; 132 132 133 133 if (v2->offset < offset2 && dts.data[k]) 134 134 break; // overlap 135 135 } 136 136 } 137 137 } 138 138 if (d) 139 139 { 140 140 if (v->offset < offset) 141 141 error(loc, "duplicate union initialization for %s", v->toChars()); 142 142 else 143 143 { unsigned sz = dt_size(d); 144 144 unsigned vsz = v->type->size(); 145 145 unsigned voffset = v->offset; 146 147 if (sz > vsz) 148 { assert(v->type->ty == Tsarray && vsz == 0); 149 error(loc, "zero length array %s has non-zero length initializer", v->toChars()); 150 } 146 151 147 152 unsigned dim = 1; 148 153 for (Type *vt = v->type->toBasetype(); 149 154 vt->ty == Tsarray; 150 155 vt = vt->next->toBasetype()) 151 156 { TypeSArray *tsa = (TypeSArray *)vt; 152 157 dim *= tsa->dim->toInteger(); 153 158 } 154 159 //printf("sz = %d, dim = %d, vsz = %d\n", sz, dim, vsz); 155 160 assert(sz == vsz || sz * dim <= vsz); 156 161 157 162 for (size_t i = 0; i < dim; i++) 158 163 { 159 164 if (offset < voffset) 160 165 pdtend = dtnzeros(pdtend, voffset - offset); 161 166 if (!d) 162 167 { 163 168 if (v->init) 164 169 d = v->init->toDt(); 165 170 else … … 672 677 if (k == dts.dim) // didn't find any overlap 673 678 { 674 679 v->type->toDt(&d); 675 680 break; 676 681 } 677 682 VarDeclaration *v2 = (VarDeclaration *)sd->fields.data[k]; 678 683 679 684 if (v2->offset < offset2 && dts.data[k]) 680 685 break; // overlap 681 686 } 682 687 } 683 688 } 684 689 if (d) 685 690 { 686 691 if (v->offset < offset) 687 692 error("duplicate union initialization for %s", v->toChars()); 688 693 else 689 694 { unsigned sz = dt_size(d); 690 695 unsigned vsz = v->type->size(); 691 696 unsigned voffset = v->offset; 692 assert(sz <= vsz); 697 698 if (sz > vsz) 699 { assert(v->type->ty == Tsarray && vsz == 0); 700 error("zero length array %s has non-zero length initializer", v->toChars()); 701 } 693 702 694 703 unsigned dim = 1; 695 704 Type *vt; 696 705 for (vt = v->type->toBasetype(); 697 706 vt->ty == Tsarray; 698 707 vt = vt->next->toBasetype()) 699 708 { TypeSArray *tsa = (TypeSArray *)vt; 700 709 dim *= tsa->dim->toInteger(); 701 710 } 711 712 //printf("sz = %d, dim = %d, vsz = %d\n", sz, dim, vsz); 713 assert(sz == vsz || sz * dim <= vsz); 702 714 703 715 for (size_t i = 0; i < dim; i++) 704 716 { 705 717 if (offset < voffset) 706 718 pdt = dtnzeros(pdt, voffset - offset); 707 719 if (!d) 708 720 { 709 721 if (v->init) 710 722 d = v->init->toDt(); 711 723 else 712 724 vt->toDt(&d); 713 725 } 714 726 pdt = dtcat(pdt, d); 715 727 d = NULL; 716 728 offset = voffset + sz; 717 729 voffset += vsz / dim; 718 730 if (sz == vsz) 719 731 break; 720 732 } 721 733 } trunk/src/todt.c
r745 r823 126 126 if (k == dts.dim) // didn't find any overlap 127 127 { 128 128 v->type->toDt(&d); 129 129 break; 130 130 } 131 131 VarDeclaration *v2 = (VarDeclaration *)ad->fields.data[k]; 132 132 133 133 if (v2->offset < offset2 && dts.data[k]) 134 134 break; // overlap 135 135 } 136 136 } 137 137 } 138 138 if (d) 139 139 { 140 140 if (v->offset < offset) 141 141 error(loc, "duplicate union initialization for %s", v->toChars()); 142 142 else 143 143 { unsigned sz = dt_size(d); 144 144 unsigned vsz = v->type->size(); 145 145 unsigned voffset = v->offset; 146 147 if (sz > vsz) 148 { assert(v->type->ty == Tsarray && vsz == 0); 149 error(loc, "zero length array %s has non-zero length initializer", v->toChars()); 150 } 146 151 147 152 unsigned dim = 1; 148 153 for (Type *vt = v->type->toBasetype(); 149 154 vt->ty == Tsarray; 150 155 vt = vt->nextOf()->toBasetype()) 151 156 { TypeSArray *tsa = (TypeSArray *)vt; 152 157 dim *= tsa->dim->toInteger(); 153 158 } 154 159 //printf("sz = %d, dim = %d, vsz = %d\n", sz, dim, vsz); 155 160 assert(sz == vsz || sz * dim <= vsz); 156 161 157 162 for (size_t i = 0; i < dim; i++) 158 163 { 159 164 if (offset < voffset) 160 165 pdtend = dtnzeros(pdtend, voffset - offset); 161 166 if (!d) 162 167 { 163 168 if (v->init) 164 169 d = v->init->toDt(); 165 170 else … … 669 674 if (k == dts.dim) // didn't find any overlap 670 675 { 671 676 v->type->toDt(&d); 672 677 break; 673 678 } 674 679 VarDeclaration *v2 = (VarDeclaration *)sd->fields.data[k]; 675 680 676 681 if (v2->offset < offset2 && dts.data[k]) 677 682 break; // overlap 678 683 } 679 684 } 680 685 } 681 686 if (d) 682 687 { 683 688 if (v->offset < offset) 684 689 error("duplicate union initialization for %s", v->toChars()); 685 690 else 686 691 { unsigned sz = dt_size(d); 687 692 unsigned vsz = v->type->size(); 688 693 unsigned voffset = v->offset; 689 assert(sz <= vsz); 694 695 if (sz > vsz) 696 { assert(v->type->ty == Tsarray && vsz == 0); 697 error("zero length array %s has non-zero length initializer", v->toChars()); 698 } 690 699 691 700 unsigned dim = 1; 692 701 Type *vt; 693 702 for (vt = v->type->toBasetype(); 694 703 vt->ty == Tsarray; 695 704 vt = vt->nextOf()->toBasetype()) 696 705 { TypeSArray *tsa = (TypeSArray *)vt; 697 706 dim *= tsa->dim->toInteger(); 698 707 } 708 //printf("sz = %d, dim = %d, vsz = %d\n", sz, dim, vsz); 709 assert(sz == vsz || sz * dim <= vsz); 699 710 700 711 for (size_t i = 0; i < dim; i++) 701 712 { 702 713 if (offset < voffset) 703 714 pdt = dtnzeros(pdt, voffset - offset); 704 715 if (!d) 705 716 { 706 717 if (v->init) 707 718 d = v->init->toDt(); 708 719 else 709 720 vt->toDt(&d); 710 721 } 711 722 pdt = dtcat(pdt, d); 712 723 d = NULL; 713 724 offset = voffset + sz; 714 725 voffset += vsz / dim; 715 726 if (sz == vsz) 716 727 break; 717 728 } 718 729 }
