authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-28 16:09:06-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-28 16:09:06-07:00
log13220ccb51b7d2cf7b8d72a662eece95784116c3
tree70ee2f007841b3b720d25e64ba9ecb4311080779
parented3117a77fffa424e7f902059a7bf3a52f758bfc

parsh understands constant sized arrays


3 files changed, 51 insertions(+), 3 deletions(-)

src/ast_render.cpp+21-2
......@@ -587,7 +587,15 @@ static void render_node(AstRender *ar, AstNode *node) {
587587 case NodeTypeUnwrapErrorExpr:
588588 zig_panic("TODO");
589589 case NodeTypeNumberLiteral:
590 zig_panic("TODO");
590 switch (node->data.number_literal.kind) {
591 case NumLitUInt:
592 fprintf(ar->f, "%" PRIu64, node->data.number_literal.data.x_uint);
593 break;
594 case NumLitFloat:
595 fprintf(ar->f, "%f", node->data.number_literal.data.x_float);
596 break;
597 }
598 break;
591599 case NodeTypeStringLiteral:
592600 zig_panic("TODO");
593601 case NodeTypeCharLiteral:
......@@ -682,7 +690,18 @@ static void render_node(AstRender *ar, AstNode *node) {
682690 case NodeTypeStructValueField:
683691 zig_panic("TODO");
684692 case NodeTypeArrayType:
685 zig_panic("TODO");
693 {
694 fprintf(ar->f, "[");
695 if (node->data.array_type.size) {
696 render_node(ar, node->data.array_type.size);
697 }
698 fprintf(ar->f, "]");
699 if (node->data.array_type.is_const) {
700 fprintf(ar->f, "const ");
701 }
702 render_node(ar, node->data.array_type.child_type);
703 break;
704 }
686705 case NodeTypeErrorType:
687706 zig_panic("TODO");
688707 }
src/parseh.cpp+26-1
......@@ -121,6 +121,25 @@ static AstNode *create_struct_field_node(Context *c, const char *name, AstNode *
121121 return node;
122122}
123123
124static AstNode *create_num_lit_unsigned(Context *c, uint64_t x) {
125 AstNode *node = create_node(c, NodeTypeNumberLiteral);
126 node->data.number_literal.kind = NumLitUInt;
127 node->data.number_literal.data.x_uint = x;
128
129 normalize_parent_ptrs(node);
130 return node;
131}
132
133static AstNode *create_array_type_node(Context *c, AstNode *child_type_node, uint64_t size, bool is_const) {
134 AstNode *node = create_node(c, NodeTypeArrayType);
135 node->data.array_type.size = create_num_lit_unsigned(c, size);
136 node->data.array_type.child_type = child_type_node;
137 node->data.array_type.is_const = is_const;
138
139 normalize_parent_ptrs(node);
140 return node;
141}
142
124143static const char *decl_name(const Decl *decl) {
125144 const NamedDecl *named_decl = static_cast<const NamedDecl *>(decl);
126145 return (const char *)named_decl->getName().bytes_begin();
......@@ -330,11 +349,17 @@ static AstNode *make_type_node(Context *c, const Type *ty, const Decl *decl,
330349 return nullptr;
331350 }
332351 }
352 case Type::ConstantArray:
353 {
354 const ConstantArrayType *const_arr_ty = static_cast<const ConstantArrayType *>(ty);
355 AstNode *child_type_node = make_qual_type_node(c, const_arr_ty->getElementType(), decl);
356 uint64_t size = const_arr_ty->getSize().getLimitedValue();
357 return create_array_type_node(c, child_type_node, size, false);
358 }
333359 case Type::BlockPointer:
334360 case Type::LValueReference:
335361 case Type::RValueReference:
336362 case Type::MemberPointer:
337 case Type::ConstantArray:
338363 case Type::IncompleteArray:
339364 case Type::VariableArray:
340365 case Type::DependentSizedArray:
test/run_tests.cpp+4
......@@ -1863,6 +1863,10 @@ pub const BarB = enum_Bar.B;
18631863pub extern fn func(a: ?&struct_Foo, b: ?&?&enum_Bar);
18641864pub const Foo = struct_Foo;
18651865pub const Bar = enum_Bar;)OUTPUT");
1866
1867 add_parseh_case("constant size array", R"SOURCE(
1868void func(int array[20]);
1869 )SOURCE", R"OUTPUT(pub extern fn func(array: [20]c_int);)OUTPUT");
18661870}
18671871
18681872static void print_compiler_invocation(TestCase *test_case) {