<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Dec 16, 2007, at 7:04 AM, Steve Naroff wrote:</div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>fyi...clang's initializer support is still incomplete (e.g. we still don't support structures).  Back in September, I added some basic support that implements ~85% of the C99 spec. Since then, Anders and I made some tweaks for supporting "basic" character arrays (which doesn't correctly handle the case below).</div><div><br class="webkit-block-placeholder"></div><div>I hope to finish initializer support after the holidays.</div></div></blockquote><div><br class="webkit-block-placeholder"></div><div>In the meantime, enough people are hitting the codegen assertion that I added a hack to the code generator to warn about it and carry on.  You'll get invalid code, but at least you won't get crashes all over the place:</div><div><br class="webkit-block-placeholder"></div><div><div><font class="Apple-style-span" face="Courier">t3.c:1:24: warning: cannot codegen this initializer yet</font></div><div><font class="Apple-style-span" face="Courier">const char x[2][4] = { { 'a', 'b', '\0', '\0' }, { 'c', 'd', 'e', '\0' } };</font></div><div><font class="Apple-style-span" face="Courier">                       ^~~~~~~~~~~~~~~~~~~~~~~~</font></div><div><br></div></div><div>-Chris</div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>snaroff</div><div><br class="webkit-block-placeholder"></div><div><div><div>On Dec 16, 2007, at 6:04 AM, Shantonu Sen wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>The following source fails to parse:</div><div><br class="webkit-block-placeholder"></div><div><div>$ cat a.c</div><div>const char w[4] = "ab";</div><div>const char x[2][4] = { { 'a', 'b', '\0', '\0' }, { 'c', 'd', 'e', '\0' } };</div><div>const char y[2][4] = { "ab", "cde" };</div><div>const char y2[2][4] = { { "ab" }, { "cde" } };</div><div>const char * const z[2] = { "ab", "cde" };</div><div>]$ clang -std=c99 a.c -fsyntax-only</div><div>a.c:3:30: error: excess elements in char array initializer</div><div>const char y[2][4] = { "ab", "cde" };</div><div>                             ^~~~~</div><div>1 diagnostic generated.</div><div>$</div></div><div><br class="webkit-block-placeholder"></div><div>This appears to be C99 6.7.8.14:</div><div><br class="webkit-block-placeholder"></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "></div><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "><font class="Apple-style-span" color="#000000" face="Helvetica"><span class="Apple-style-span" style="background-color: transparent;">14 An array of character type may be initialized by a character string literal, optionally</span></font><span style="font: 12.0px Helvetica"><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"> </span></font></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "><font class="Apple-style-span" color="#000000" face="Helvetica"><span class="Apple-style-span" style="background-color: transparent;">enclosed in braces. Successive characters of the character string literal (including the</span></font><span style="font: 12.0px Helvetica"><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"> </span></font></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "><font class="Apple-style-span" color="#000000" face="Helvetica"><span class="Apple-style-span" style="background-color: transparent;">terminating null character if there is room or if the array is of unknown size) initialize the</span></font><span style="font: 12.0px Helvetica"><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"> </span></font></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "><font class="Apple-style-span" color="#000000" face="Helvetica"><span class="Apple-style-span" style="background-color: transparent;">elements of the array.</span></font><span style="font: 12.0px Helvetica"><font class="Apple-style-span" color="#000000"><span class="Apple-style-span" style="background-color: transparent;"> </span></font></span></div></blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "><font class="Apple-style-span" face="Helvetica"><br class="webkit-block-placeholder"></font></div></div><div>Additionally, even when compiling just "x", -emit-llvm fails:</div><div><div>$ cat b.c</div><div>const char x[2][4] = { { 'a', 'b', '\0', '\0' }, { 'c', 'd', 'e', '\0' } };</div><div>$ clang -std=c99 b.c -ast-dump</div><div>typedef char *__builtin_va_list;</div><div>Read top-level variable decl: 'x'</div><div>$ clang -std=c99 b.c -emit-llvm 2>&1 | c++filt -n</div><div>Assertion failed: (ILE->getType()->isArrayType() || ILE->getType()->isStructureType()), function GenerateAggregateInit, file CodeGenModule.cpp, line 284.</div><div>0   clang                               0x0021b8cb (anonymous namespace)::PrintStackTrace() + 45</div><div>1   clang                               0x0021bc71 (anonymous namespace)::SignalHandler(int) + 323</div><div>2   libSystem.B.dylib                   0x9188897b _sigtramp + 43</div><div>3   ???                                 0xffffffff 0x0 + 4294967295</div><div>4   libSystem.B.dylib                   0x91901782 raise + 26</div><div>5   libSystem.B.dylib                   0x91910d3f abort + 73</div><div>6   libSystem.B.dylib                   0x91902923 __assert_rtn + 101</div><div>7   clang                               0x0005d9a1 clang::CodeGen::CodeGenModule::GetAddrOfConstantCFString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) + 1577</div><div>8   clang                               0x0005e4ce clang::CodeGen::CodeGenModule::GetAddrOfConstantCFString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) + 4438</div><div>9   clang                               0x0005dae3 clang::CodeGen::CodeGenModule::GetAddrOfConstantCFString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) + 1899</div><div>10  clang                               0x0005e4ce clang::CodeGen::CodeGenModule::GetAddrOfConstantCFString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) + 4438</div><div>11  clang                               0x0005e53e clang::CodeGen::CodeGenModule::EmitGlobalInit(clang::Expr const*) + 24</div><div>12  clang                               0x0005e6d6 clang::CodeGen::CodeGenModule::EmitGlobalVar(clang::FileVarDecl const*) + 406</div><div>13  clang                               0x0005e7e6 clang::CodeGen::CodeGenModule::EmitGlobalVarDeclarator(clang::FileVarDecl const*) + 26</div><div>14  clang                               0x00067ddc clang::CodeGen::CodeGenGlobalVar(clang::CodeGen::CodeGenModule*, clang::FileVarDecl*) + 24</div><div>15  clang                               0x00006229 (anonymous namespace)::LLVMEmitter::HandleTopLevelDecl(clang::Decl*) + 119</div><div>16  clang                               0x0007af58 clang::ParseAST(clang::Preprocessor&, unsigned int, clang::ASTConsumer*, bool) + 258</div><div>17  clang                               0x000222c2 llvm::BitstreamWriter::Emit(unsigned int, unsigned int) + 3740</div><div>18  clang                               0x0002444e main + 1370</div><div>19  clang                               0x00001cca start + 54</div><div><br class="webkit-block-placeholder"></div></div><br><div apple-content-edited="true"> <span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Shantonu Sen</div><div><a href="mailto:ssen@apple.com">ssen@apple.com</a></div><div><br class="webkit-block-placeholder"></div></div></span><br class="Apple-interchange-newline"> </div><br></div>_______________________________________________<br>cfe-dev mailing list<br><a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br></blockquote></div><br></div></div>_______________________________________________<br>cfe-dev mailing list<br><a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev<br></blockquote></div><br></body></html>