- if(symbol->context == context) {
- declaration_t *previous_declaration = symbol->declaration;
- if(symbol->declaration != NULL) {
- if(!is_compatible_declaration(declaration, previous_declaration)) {
- parser_print_error_prefix_pos(declaration->source_position);
- fprintf(stderr, "definition of symbol '%s' with type ",
- declaration->symbol->string);
- error();
- print_type(declaration->type);
- fputc('\n', stderr);
- parser_print_error_prefix_pos(
- previous_declaration->source_position);
- fprintf(stderr, "is incompatible with previous declaration "
- "of type ");
- print_type(previous_declaration->type);
- fputc('\n', stderr);
- }
- return previous_declaration;
+ /* a declaration should be only pushed once */
+ assert(declaration->parent_context == NULL);
+ declaration->parent_context = context;
+
+ declaration_t *previous_declaration = get_declaration(symbol, namespace);
+ assert(declaration != previous_declaration);
+ if(previous_declaration != NULL
+ && previous_declaration->parent_context == context) {
+ if(!is_compatible_declaration(declaration, previous_declaration)) {
+ parser_print_error_prefix_pos(declaration->source_position);
+ fprintf(stderr, "definition of symbol %s%s with type ",
+ get_namespace_prefix(namespace), symbol->string);
+ error();
+ print_type(declaration->type);
+ fputc('\n', stderr);
+ parser_print_error_prefix_pos(
+ previous_declaration->source_position);
+ fprintf(stderr, "is incompatible with previous declaration "
+ "of type ");
+ print_type(previous_declaration->type);
+ fputc('\n', stderr);