From: SourceForge.net <no...@so...> - 2010-04-23 01:18:49
|
Feature Requests item #2991122, was opened at 2010-04-22 17:39 Message generated for change (Comment added) made by cananian You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=350599&aid=2991122&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Priority: 5 Private: No Submitted By: C. Scott Ananian (cananian) Assigned to: Nobody/Anonymous (nobody) Summary: C99 designated initializer support Initial Comment: Add support for C99 "designated initializers", like: struct { int x, y; } point = { .y = 3, .x = 2 }; ---------------------------------------------------------------------- >Comment By: C. Scott Ananian (cananian) Date: 2010-04-22 21:18 Message: I attached an updated patch which honors initializer order, as the spec says we ought. For yr reference, here's my test case; I've examined the assembly output for mcs51, pic, and pic16 and convinced myself it's correct: /** Tests for designated initializers */ struct point { int x, y; }; //char __code simpletest[] = "foo"; int a1[6] = { [4] = 29, 30, [2] = 15 }; int __code a2[6] = { [4] = 29, 30, [2] = 15 }; unsigned char widths1[] = { [2] = 2, [20] = 3, [2] = 1 }; unsigned char __code widths2[] = { [2] = 2, [20] = 3, [2] = 1 }; int foo(int xvalue, int yvalue) { struct point p = { .y = yvalue, .x = xvalue }; return p.x + p.y; } struct point p1 = { .y = 2, .x = 1 }; struct point __code p2 = { .y = 2, .x = 1 }; struct point pa1[] = { { 1 } }; union foo { int i; float d; }; union foo f1 = { .d = 4 }; union foo __code f2 = { .d = 4 }; union foo __code f3 = { .i = 4 }; int whitespace1[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1, ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 }; int __code whitespace2[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1, ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 }; struct test { int x; int y1 : 2; int : 2; int y2 : 3; int z; }; struct test stest1 = { .y1 = 1, 3, 4, .x = 2, .z = 5 }; struct test __code stest2 = { .y1 = 1, 3, 4, .x = 2, .z = 5 }; const char *foo1 = "bar"; char * __code foo2 = "bat"; struct point ptarray1[10] = { [2].y = 5, [2].x = 6, [0].x = 7 }; struct point __code ptarray2[10] = { [2].y = 5, [2].x = 6, [0].x = 7, [2].x = 8 }; void main(void) { } ---------------------------------------------------------------------- Comment By: C. Scott Ananian (cananian) Date: 2010-04-22 18:43 Message: The standard seems to use "designation" to mean "a sequence of one or more designators". I tried to use this definition in the code as well. Good catch on the order of initialization. My original patches followed the initializer order more closely, but I reworked it to try to remove some duplicate code. I can go back to the version that respects the initializer order. We do in fact omit initialization for holes; the code you're looking at is for 'code' segment initializations, where we emit a static set of '.db' statements -- obviously we can't skip holes here. ---------------------------------------------------------------------- Comment By: Philipp Krause (spth) Date: 2010-04-22 18:31 Message: - Should the term "designation initializer" be used in place of "designated initalizer"? The first term is the one used in the C standard, while the second oine is used in the rationale. - Does the standard mandate that the initializations occour in a given order? E.g. we have a volatile struct, inilialized using a designation initalizer that lists the second member before the second do we have to really initialize the second member first? Verse 1670-1672 seems to suggest so to me (who doesn't really know anything about designation initializers). - The has a comment "If this is a hole, substitute an appropriate initializer." Unless the object is static, can we increase efficiency by not doing the initialization for these holes instead of initializing them to 0? Philipp ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=350599&aid=2991122&group_id=599 |