diff options
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/gcc/elna-builtins.cc | 9 | ||||
| -rw-r--r-- | gcc/gcc/elna-generic.cc | 7 |
2 files changed, 11 insertions, 5 deletions
diff --git a/gcc/gcc/elna-builtins.cc b/gcc/gcc/elna-builtins.cc index 9552abb..c728a00 100644 --- a/gcc/gcc/elna-builtins.cc +++ b/gcc/gcc/elna-builtins.cc @@ -206,6 +206,15 @@ namespace elna::gcc { return build_enumeration_type(reference->members); } + else if (auto reference = type.get<boot::extern_type>()) + { + /* + * An incomplete type: a record without fields and without layout, + * mirroring a forward-declared C structure. Opaque types can only + * occur behind pointers, so no size or field is ever requested. + */ + return make_node(RECORD_TYPE); + } else if (auto reference = type.get<boot::pointer_type>()) { return build_pointer_type(get_inner_alias(reference->base, symbols)); diff --git a/gcc/gcc/elna-generic.cc b/gcc/gcc/elna-generic.cc index fb898d5..b657e92 100644 --- a/gcc/gcc/elna-generic.cc +++ b/gcc/gcc/elna-generic.cc @@ -525,11 +525,8 @@ namespace elna::gcc { auto value = this->constant_evaluator.evaluate_traits(*trait); - if (!value.has_value()) - { - this->current_expression = error_mark_node; - return; - } + // Type checking rejects every trait invocation that the evaluator cannot fold. + gcc_assert(value.has_value()); tree type = get_inner_alias(trait->type_decoration, this->symbols); this->current_expression = constant_to_tree(value.value(), this->symbols, type); } |
