[cfe-dev] multi-dimensional char arrays

Steve Naroff snaroff at apple.com
Sun Dec 16 07:04:51 PST 2007


Shantonu,

Thanks for the bug report.

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).

I hope to finish initializer support after the holidays.

snaroff

On Dec 16, 2007, at 6:04 AM, Shantonu Sen wrote:

> The following source fails to parse:
>
> $ cat a.c
> const char w[4] = "ab";
> const char x[2][4] = { { 'a', 'b', '\0', '\0' }, { 'c', 'd', 'e',  
> '\0' } };
> const char y[2][4] = { "ab", "cde" };
> const char y2[2][4] = { { "ab" }, { "cde" } };
> const char * const z[2] = { "ab", "cde" };
> ]$ clang -std=c99 a.c -fsyntax-only
> a.c:3:30: error: excess elements in char array initializer
> const char y[2][4] = { "ab", "cde" };
>                              ^~~~~
> 1 diagnostic generated.
> $
>
> This appears to be C99 6.7.8.14:
>
>> 14 An array of character type may be initialized by a character  
>> string literal, optionally
>> enclosed in braces. Successive characters of the character string  
>> literal (including the
>> terminating null character if there is room or if the array is of  
>> unknown size) initialize the
>> elements of the array.
>
> Additionally, even when compiling just "x", -emit-llvm fails:
> $ cat b.c
> const char x[2][4] = { { 'a', 'b', '\0', '\0' }, { 'c', 'd', 'e',  
> '\0' } };
> $ clang -std=c99 b.c -ast-dump
> typedef char *__builtin_va_list;
> Read top-level variable decl: 'x'
> $ clang -std=c99 b.c -emit-llvm 2>&1 | c++filt -n
> Assertion failed: (ILE->getType()->isArrayType() || ILE->getType()- 
> >isStructureType()), function GenerateAggregateInit, file  
> CodeGenModule.cpp, line 284.
> 0   clang                               0x0021b8cb (anonymous  
> namespace)::PrintStackTrace() + 45
> 1   clang                               0x0021bc71 (anonymous  
> namespace)::SignalHandler(int) + 323
> 2   libSystem.B.dylib                   0x9188897b _sigtramp + 43
> 3   ???                                 0xffffffff 0x0 + 4294967295
> 4   libSystem.B.dylib                   0x91901782 raise + 26
> 5   libSystem.B.dylib                   0x91910d3f abort + 73
> 6   libSystem.B.dylib                   0x91902923 __assert_rtn + 101
> 7   clang                               0x0005d9a1  
> clang 
> ::CodeGen 
> ::CodeGenModule::GetAddrOfConstantCFString(std::basic_string<char,  
> std::char_traits<char>, std::allocator<char> > const&) + 1577
> 8   clang                               0x0005e4ce  
> clang 
> ::CodeGen 
> ::CodeGenModule::GetAddrOfConstantCFString(std::basic_string<char,  
> std::char_traits<char>, std::allocator<char> > const&) + 4438
> 9   clang                               0x0005dae3  
> clang 
> ::CodeGen 
> ::CodeGenModule::GetAddrOfConstantCFString(std::basic_string<char,  
> std::char_traits<char>, std::allocator<char> > const&) + 1899
> 10  clang                               0x0005e4ce  
> clang 
> ::CodeGen 
> ::CodeGenModule::GetAddrOfConstantCFString(std::basic_string<char,  
> std::char_traits<char>, std::allocator<char> > const&) + 4438
> 11  clang                               0x0005e53e  
> clang::CodeGen::CodeGenModule::EmitGlobalInit(clang::Expr const*) + 24
> 12  clang                               0x0005e6d6  
> clang::CodeGen::CodeGenModule::EmitGlobalVar(clang::FileVarDecl  
> const*) + 406
> 13  clang                               0x0005e7e6  
> clang 
> ::CodeGen::CodeGenModule::EmitGlobalVarDeclarator(clang::FileVarDecl  
> const*) + 26
> 14  clang                               0x00067ddc  
> clang::CodeGen::CodeGenGlobalVar(clang::CodeGen::CodeGenModule*,  
> clang::FileVarDecl*) + 24
> 15  clang                               0x00006229 (anonymous  
> namespace)::LLVMEmitter::HandleTopLevelDecl(clang::Decl*) + 119
> 16  clang                               0x0007af58  
> clang::ParseAST(clang::Preprocessor&, unsigned int,  
> clang::ASTConsumer*, bool) + 258
> 17  clang                               0x000222c2  
> llvm::BitstreamWriter::Emit(unsigned int, unsigned int) + 3740
> 18  clang                               0x0002444e main + 1370
> 19  clang                               0x00001cca start + 54
>
>
> Shantonu Sen
> ssen at apple.com
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20071216/d04dd7a5/attachment.html>


More information about the cfe-dev mailing list