aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gcc/elna-builtins.cc9
-rw-r--r--gcc/gcc/elna-generic.cc7
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);
}