From bf41d022ce9736a92097f416ab96fca7ab4594ca Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sun, 23 Aug 2026 14:05:26 +0200 Subject: Reject 0-sized variables --- gcc/gcc/elna-builtins.cc | 9 +++++++++ gcc/gcc/elna-generic.cc | 7 ++----- 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'gcc') 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()) + { + /* + * 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()) { 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); } -- cgit v1.2.3