case ATOMIC_TYPE_LONG_DOUBLE_COMPLEX:
tc = complex_type_class;
break;
-#endif
-
-#ifdef PROVIDE_IMAGINARY
case ATOMIC_TYPE_FLOAT_IMAGINARY:
case ATOMIC_TYPE_DOUBLE_IMAGINARY:
case ATOMIC_TYPE_LONG_DOUBLE_IMAGINARY:
declaration_t *compound_entry = compound_declaration->context.declarations;
compound_graph_path_entry_t entry;
- entry.type = COMPOUND_GRAPH_ENTRY_COMPOUND;
- entry.prev = last_entry;
+ entry.type = COMPOUND_GRAPH_ENTRY_COMPOUND;
+ entry.prev = last_entry;
++len;
size_t i = 0;
}
}
+static void create_initializer_array(initializer_list_t *initializer,
+ array_type_t *type, ir_entity *entity,
+ compound_graph_path_entry_t *last_entry,
+ int len)
+{
+ type_t *element_type = type->element_type;
+
+ compound_graph_path_entry_t entry;
+ entry.type = COMPOUND_GRAPH_ENTRY_ARRAY;
+ entry.prev = last_entry;
+ ++len;
+
+ for(size_t i = 0; i < initializer->len; ++i) {
+ entry.v.array_index = i;
+
+ initializer_t *sub_initializer = initializer->initializers[i];
+
+ if(sub_initializer->type == INITIALIZER_VALUE) {
+ create_initializer_value((initializer_value_t*) sub_initializer,
+ entity, &entry, len);
+ } else {
+ assert(sub_initializer->type == INITIALIZER_LIST);
+ create_initializer_list((initializer_list_t*) sub_initializer,
+ element_type, entity, &entry, len);
+ }
+ }
+}
+
static void create_initializer_list(initializer_list_t *initializer,
type_t *type, ir_entity *entity,
compound_graph_path_entry_t *entry, int len)
{
if(type->type == TYPE_ARRAY) {
- /* TODO */
+ create_initializer_array(initializer, (array_type_t*) type,
+ entity, entry, len);
} else {
assert(type->type == TYPE_COMPOUND_STRUCT
|| type->type == TYPE_COMPOUND_UNION);
#ifdef PROVIDE_COMPLEX
#define COMPLEX_SPECIFIERS \
case T__Complex:
-#else
-#define COMPLEX_SPECIFIERS
-#endif
-
-#ifdef PROVIDE_IMAGINARY
#define IMAGINARY_SPECIFIERS \
case T__Imaginary:
#else
+#define COMPLEX_SPECIFIERS
#define IMAGINARY_SPECIFIERS
#endif
/* TODO: ignore qualifiers, comparing pointers is probably
* not correct */
if(expression != NULL && expression_type == type) {
- initializer_t *result = allocate_ast_zero(sizeof(result[0]));
- result->type = INITIALIZER_VALUE;
+ initializer_value_t *result = allocate_ast_zero(sizeof(result[0]));
+ result->initializer.type = INITIALIZER_VALUE;
if(type != NULL) {
semantic_assign(type, &expression, "initializer");
}
- //result->v.value = expression;
+ result->value = expression;
- return result;
+ return (initializer_t*) result;
}
bool read_paren = false;
}
/* descend into subtype */
- initializer_t *result = NULL;
+ initializer_t *result = NULL;
+ initializer_t **elems;
if(type->type == TYPE_ARRAY) {
array_type_t *array_type = (array_type_t*) type;
type_t *element_type = array_type->element_type;
element_type = skip_typeref(element_type);
- result
- = parse_sub_initializer(element_type, expression, expression_type);
+ initializer_t *sub;
+ had_initializer_brace_warning = false;
+ if(expression == NULL) {
+ sub = parse_sub_initializer_elem(element_type);
+ } else {
+ sub = parse_sub_initializer(element_type, expression,
+ expression_type);
+ }
+
+ /* didn't match the subtypes -> try the parent type */
+ if(sub == NULL) {
+ assert(!read_paren);
+ return NULL;
+ }
+
+ elems = NEW_ARR_F(initializer_t*, 0);
+ ARR_APP1(initializer_t*, elems, sub);
+
+ while(true) {
+ if(token.type == '}')
+ break;
+ expect_block(',');
+
+ initializer_t *sub
+ = parse_sub_initializer(element_type, NULL, NULL);
+ if(sub == NULL) {
+ /* TODO error, do nicer cleanup */
+ parse_error("member initializer didn't match");
+ DEL_ARR_F(elems);
+ return NULL;
+ }
+ ARR_APP1(initializer_t*, elems, sub);
+ }
} else {
assert(type->type == TYPE_COMPOUND_STRUCT
|| type->type == TYPE_COMPOUND_UNION);
return NULL;
}
- initializer_t **elems = NEW_ARR_F(initializer_t*, 0);
+ elems = NEW_ARR_F(initializer_t*, 0);
ARR_APP1(initializer_t*, elems, sub);
declaration_t *iter = first->next;
type_t *iter_type = iter->type;
iter_type = skip_typeref(iter_type);
- /* read next token */
initializer_t *sub = parse_sub_initializer(iter_type, NULL, NULL);
if(sub == NULL) {
/* TODO error, do nicer cleanup*/
}
ARR_APP1(initializer_t*, elems, sub);
}
+ }
- int len = ARR_LEN(elems);
- size_t elems_size = sizeof(initializer_t*) * len;
+ int len = ARR_LEN(elems);
+ size_t elems_size = sizeof(initializer_t*) * len;
- initializer_list_t *init
- = allocate_ast_zero(sizeof(init[0]) + elems_size);
+ initializer_list_t *init = allocate_ast_zero(sizeof(init[0]) + elems_size);
- init->initializer.type = INITIALIZER_LIST;
- init->len = len;
- memcpy(init->initializers, elems, elems_size);
- DEL_ARR_F(elems);
+ init->initializer.type = INITIALIZER_LIST;
+ init->len = len;
+ memcpy(init->initializers, elems, elems_size);
+ DEL_ARR_F(elems);
- result = (initializer_t*) init;
- }
+ result = (initializer_t*) init;
if(read_paren) {
if(token.type == ',')
SPECIFIER_VOID = 1 << 10,
#ifdef PROVIDE_COMPLEX
SPECIFIER_COMPLEX = 1 << 11,
-#endif
-#ifdef PROVIDE_IMAGINARY
SPECIFIER_IMAGINARY = 1 << 12,
#endif
} specifiers_t;
MATCH_SPECIFIER(T__Bool, SPECIFIER_BOOL, "_Bool")
#ifdef PROVIDE_COMPLEX
MATCH_SPECIFIER(T__Complex, SPECIFIER_COMPLEX, "_Complex")
-#endif
-#ifdef PROVIDE_IMAGINARY
MATCH_SPECIFIER(T__Imaginary, SPECIFIER_IMAGINARY, "_Imaginary")
#endif
case T_inline:
case SPECIFIER_LONG | SPECIFIER_DOUBLE | SPECIFIER_COMPLEX:
atomic_type = ATOMIC_TYPE_LONG_DOUBLE_COMPLEX;
break;
-#endif
-#ifdef PROVIDE_IMAGINARY
case SPECIFIER_FLOAT | SPECIFIER_IMAGINARY:
atomic_type = ATOMIC_TYPE_FLOAT_IMAGINARY;
break;
if(token.type == T_IDENTIFIER) {
symbol_t *symbol = token.v.symbol;
if(!is_typedef_symbol(symbol)) {
- /* TODO */
+ /* TODO: K&R style C parameters */
parse_identifier_list();
return NULL;
}
parser_error_multiple_definition(declaration, ndeclaration);
}
- ndeclaration->init.initializer = parse_initializer(declaration->type);
+ ndeclaration->init.initializer
+ = parse_initializer(declaration->type);
} else if(token.type == '{') {
if(declaration->type->type != TYPE_FUNCTION) {
parser_print_error_prefix();