bool must_be_constant;
} parse_initializer_env_t;
-typedef declaration_t* (*parsed_declaration_func) (declaration_t *declaration);
+typedef declaration_t* (*parsed_declaration_func) (declaration_t *declaration, bool is_definition);
static token_t token;
static token_t lookahead_buffer[MAX_LOOKAHEAD];
static void parse_compound_type_entries(declaration_t *compound_declaration);
static declaration_t *parse_declarator(
const declaration_specifiers_t *specifiers, bool may_be_abstract);
-static declaration_t *record_declaration(declaration_t *declaration);
+static declaration_t *record_declaration(declaration_t *declaration, bool is_definition);
static void semantic_comparison(binary_expression_t *expression);
declaration->source_position = builtin_source_position;
declaration->implicit = true;
- record_declaration(declaration);
+ record_declaration(declaration, false);
type_t *typedef_type = allocate_type_zero(TYPE_TYPEDEF, &builtin_source_position);
typedef_type->typedeft.declaration = declaration;
/* TODO semantic */
}
- record_declaration(entry);
+ record_declaration(entry, false);
if (token.type != ',')
break;
storage_class : STORAGE_CLASS_AUTO;
decl->symbol = symbol;
decl->implicit = true;
- record_declaration(decl);
+ record_declaration(decl, false);
return decl;
}
return strcmp(sym->string, "main") == 0;
}
-static declaration_t *internal_record_declaration(
+static declaration_t *record_declaration(
declaration_t *const declaration,
const bool is_definition)
{
return append_declaration(declaration);
}
-static declaration_t *record_declaration(declaration_t *declaration)
-{
- return internal_record_declaration(declaration, false);
-}
-
-static declaration_t *record_definition(declaration_t *declaration)
-{
- return internal_record_declaration(declaration, true);
-}
-
static void parser_error_multiple_definition(declaration_t *declaration,
const source_position_t *source_position)
{
add_anchor_token('=');
add_anchor_token(',');
while(true) {
- declaration_t *declaration = finished_declaration(ndeclaration);
+ declaration_t *declaration =
+ finished_declaration(ndeclaration, token.type == '=');
type_t *orig_type = declaration->type;
type_t *type = skip_typeref(orig_type);
rem_anchor_token(',');
}
-static declaration_t *finished_kr_declaration(declaration_t *declaration)
+static declaration_t *finished_kr_declaration(declaration_t *declaration, bool is_definition)
{
symbol_t *symbol = declaration->symbol;
if (symbol == NULL) {
}
namespace_t namespc = (namespace_t) declaration->namespc;
if (namespc != NAMESPACE_NORMAL) {
- return record_declaration(declaration);
+ return record_declaration(declaration, false);
}
declaration_t *previous_declaration = get_declaration(symbol, namespc);
return declaration;
}
+ if (is_definition) {
+ errorf(HERE, "parameter %Y is initialised", declaration->symbol);
+ }
+
if (previous_declaration->type == NULL) {
previous_declaration->type = declaration->type;
previous_declaration->declared_storage_class = declaration->declared_storage_class;
previous_declaration->parent_scope = scope;
return previous_declaration;
} else {
- return record_declaration(declaration);
+ return record_declaration(declaration, false);
}
}
switch (token.type) {
case ',':
case ';':
- parse_declaration_rest(ndeclaration, &specifiers, record_declaration);
- return;
-
case '=':
- parse_declaration_rest(ndeclaration, &specifiers, record_definition);
+ parse_declaration_rest(ndeclaration, &specifiers, record_declaration);
return;
}
ndeclaration->type = type;
}
- declaration_t *const declaration = record_definition(ndeclaration);
+ declaration_t *const declaration = record_declaration(ndeclaration, true);
if (ndeclaration != declaration) {
declaration->scope = ndeclaration->scope;
}
bool strict_prototypes_old = warning.strict_prototypes;
warning.strict_prototypes = false;
- record_declaration(declaration);
+ record_declaration(declaration, false);
warning.strict_prototypes = strict_prototypes_old;
return declaration;