[cfe-dev] multi-dimensional char arrays

Shantonu Sen ssen at apple.com
Sun Dec 16 06:04:49 PST 2007


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



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


More information about the cfe-dev mailing list