+ type_t *orig_type = compound->datatype;
+ if(orig_type == NULL)
+ return make_invalid_expression();
+
+ type_t *type = skip_typeref(orig_type);
+
+ type_t *type_left = type;
+ if(is_pointer) {
+ if(type->type != TYPE_POINTER) {
+ parser_print_error_prefix();
+ fprintf(stderr, "left hand side of '->' is not a pointer, but ");
+ print_type_quoted(orig_type);
+ fputc('\n', stderr);
+ return make_invalid_expression();
+ }
+ pointer_type_t *pointer_type = (pointer_type_t*) type;
+ type_left = pointer_type->points_to;
+ }
+ type_left = skip_typeref(type_left);
+
+ if(type_left->type != TYPE_COMPOUND_STRUCT
+ && type_left->type != TYPE_COMPOUND_UNION) {
+ parser_print_error_prefix();
+ fprintf(stderr, "request for member '%s' in something not a struct or "
+ "union, but ", symbol->string);
+ print_type_quoted(type_left);
+ fputc('\n', stderr);
+ return make_invalid_expression();
+ }
+
+ compound_type_t *compound_type = (compound_type_t*) type_left;
+ declaration_t *declaration = compound_type->declaration;
+
+ if(!declaration->init.is_defined) {
+ parser_print_error_prefix();
+ fprintf(stderr, "request for member '%s' of incomplete type ",
+ symbol->string);
+ print_type_quoted(type_left);
+ fputc('\n', stderr);
+ return make_invalid_expression();
+ }
+
+ declaration_t *iter = declaration->context.declarations;
+ for( ; iter != NULL; iter = iter->next) {
+ if(iter->symbol == symbol) {
+ break;
+ }
+ }
+ if(iter == NULL) {
+ parser_print_error_prefix();
+ print_type_quoted(type_left);
+ fprintf(stderr, " has no member named '%s'\n", symbol->string);
+ return make_invalid_expression();
+ }
+
+ select->compound_entry = iter;
+ select->expression.datatype = iter->type;