diff --git a/README.md b/README.md index b2a2569a3..adaefbacb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Inform 7 -v10.1.0-alpha.1+6U27 'Krypton' (8 February 2022) +v10.1.0-alpha.1+6U28 'Krypton' (9 February 2022) ## About Inform 7 diff --git a/build.txt b/build.txt index 52822b4e0..7d0280a71 100644 --- a/build.txt +++ b/build.txt @@ -1,3 +1,3 @@ Prerelease: alpha.1 -Build Date: 8 February 2022 -Build Number: 6U27 +Build Date: 9 February 2022 +Build Number: 6U28 diff --git a/docs/building-module/1-bm.html b/docs/building-module/1-bm.html index 8e1836533..a4b994d98 100644 --- a/docs/building-module/1-bm.html +++ b/docs/building-module/1-bm.html @@ -166,7 +166,7 @@ functions in this module for constructing trees. HierarchyLocations::clear_site_data(I); Produce::clear_site_data(I); Packaging::clear_site_data(I); - Primitives::clear_site_data(I); + Primitives::clear_site_data(I); } diff --git a/docs/building-module/1-ip.html b/docs/building-module/1-ip.html index b0d0ee98b..6ac2a0b35 100644 --- a/docs/building-module/1-ip.html +++ b/docs/building-module/1-ip.html @@ -73,7 +73,7 @@ function togglePopup(material_id) {

The standard set of primitive invocations available in Inter code as generated by the Inform tool-chain.

-
+

§1. The standard Inform 7 instruction set. Metadata on the primitives used by Inter in the Inform tool-set is stored as an array standard_inform7_primitives of the following records: @@ -333,7 +333,7 @@ to text_stream *int standard_inform7_primitives_prepared = FALSE; inter_ti standard_inform7_primitives_extent = 0; -void Primitives::prepare_standard_set_array(void) { +void Primitives::prepare_standard_set_array(void) { if (standard_inform7_primitives_prepared == FALSE) { standard_inform7_primitives_prepared = TRUE; for (inter_ti i=0; ; i++) { @@ -422,7 +422,7 @@ results (see below). return I"<none>"; } -inter_ti Primitives::name_to_BIP(text_stream *name) { +inter_ti Primitives::name_to_BIP(text_stream *name) { Primitives::prepare_standard_set_array(); for (inter_ti i=0; i<standard_inform7_primitives_extent; i++) if (Str::eq(name, standard_inform7_primitives[i].name)) @@ -430,7 +430,22 @@ results (see below). return 0; } -

§6. In general the standard set is a miscellany, but with one systematic family +

§6. This is printed when inter is run with the -primitives switch. +

+ +
+void Primitives::show_primitives(OUTPUT_STREAM) {
+    WRITE("  Code     Primitive           Signature\n");
+    Primitives::prepare_standard_set_array();
+    for (inter_ti i=0; i<standard_inform7_primitives_extent; i++) {
+        inform7_primitive *prim = &(standard_inform7_primitives[i]);
+        WRITE("  %4x     %S", prim->BIP, prim->name);
+        for (int j = Str::len(prim->name); j<20; j++) PUT(' ');
+        WRITE("%S\n", prim->signature);
+    }
+}
+
+

§7. In general the standard set is a miscellany, but with one systematic family of primitives for making indirect function calls (that is, calling a function whose identity is not known at compile time). These 12 primitives all do the same thing, but vary in their signatures, according to how many arguments @@ -478,7 +493,7 @@ the function call has, and whether its return value is to be used or discarded. return 0; } -

§7. And these functions say whether or not a BIP belongs to the family: +

§8. And these functions say whether or not a BIP belongs to the family:

@@ -502,7 +517,7 @@ the function call has, and whether its return value is to be used or discarded.
     return FALSE;
 }
 
-

§8. About the terms. For example, 0 for the signature void -> val, or 2 for ref val -> val. +

§9. About the terms. For example, 0 for the signature void -> val, or 2 for ref val -> val.

The *_XBIP operations are treated as if they had the signature val val -> void. @@ -515,7 +530,7 @@ the function call has, and whether its return value is to be used or discarded. return standard_inform7_primitives[BIP - 1].term_count; } -

§9. And this returns the primitive category for each term, counting from 0: +

§10. And this returns the primitive category for each term, counting from 0: this will be VAL_PRIM_CAT, CODE_PRIM_CAT, REF_PRIM_CAT or LAB_PRIM_CAT.

@@ -530,7 +545,7 @@ this will be VAL_PRIM_CAT return standard_inform7_primitives[BIP - 1].term_categories[i]; } -

§10. Returns TRUE if any of those categories is a CODE_PRIM_CAT; note that +

§11. Returns TRUE if any of those categories is a CODE_PRIM_CAT; note that this is cached for speed.

@@ -541,7 +556,7 @@ this is cached for speed. return standard_inform7_primitives[BIP - 1].takes_code_blocks; } -

§11. Primitives within a specific tree. So much for discussing the instruction set in the abstract: now we need code +

§12. Primitives within a specific tree. So much for discussing the instruction set in the abstract: now we need code to handle its declaration in each Inter tree we make. Note that, for speed, each inter_tree structure contains the following index array inside it:

@@ -557,7 +572,7 @@ each inter_tree } -

§12. That array will allow us to obtain almost instantly the Inter symbol for +

§13. That array will allow us to obtain almost instantly the Inter symbol for the primitive in I having any given BIP. We need to remember that primitives can come into being in two ways, though: either by us creating them here (see below), or by Inter code being read in from an external file. If the latter, @@ -566,16 +581,16 @@ the following function must be run to make sure the index is built:

 void Primitives::index_primitives_in_tree(inter_tree *I) {
-    InterTree::traverse_root_only(I, Primitives::scan_visitor, NULL, PRIMITIVE_IST);
+    InterTree::traverse_root_only(I, Primitives::scan_visitor, NULL, PRIMITIVE_IST);
 }
 
 void Primitives::scan_visitor(inter_tree *I, inter_tree_node *P, void *v_state) {
     inter_symbol *prim = InterSymbolsTable::symbol_from_ID_at_node(P, DEFN_PRIM_IFLD);
-    inter_ti bip = Primitives::to_BIP(I, prim);
+    inter_ti bip = Primitives::to_BIP(I, prim);
     if (bip) I->site.spridata.primitives_by_BIP[bip] = prim;
 }
 
-

§13. Here is where we declare primitives. Since there are only around 100 of these, +

§14. Here is where we declare primitives. Since there are only around 100 of these, it's fine for the actual primitive declarations to be made a little slowly: so we do it by writing the declarations out in textual Inter and then parsing them. We then make various paranoid consistency checks. @@ -593,7 +608,7 @@ We then make various paranoid consistency checks. inter_error_message *E = NULL; inter_symbol *S = Inter::Textual::find_symbol(I, NULL, InterTree::global_scope(I), prim, PRIMITIVE_IST, &E); - inter_ti bip = Primitives::to_BIP(I, S); + inter_ti bip = Primitives::to_BIP(I, S); if (bip == 0) internal_error("missing bip"); if (bip != standard_inform7_primitives[i].BIP) internal_error("wrong BIP"); if (bip >= MAX_BIPS) internal_error("unsafely high bip"); @@ -603,7 +618,7 @@ We then make various paranoid consistency checks. } } -

§14. Finally, then, we provide functions to convert between BIPs and local primitive +

§15. Finally, then, we provide functions to convert between BIPs and local primitive symbols.

@@ -619,7 +634,7 @@ symbols. return prim; } -inter_ti Primitives::to_BIP(inter_tree *I, inter_symbol *symb) { +inter_ti Primitives::to_BIP(inter_tree *I, inter_symbol *symb) { if (symb == NULL) return 0; int B = SymbolAnnotation::get_i(symb, BIP_CODE_IANN); inter_ti bip = (B > 0)?((inter_ti) B):0; diff --git a/docs/building-module/1-ls.html b/docs/building-module/1-ls.html index 6b52cc9e0..b98cedacc 100644 --- a/docs/building-module/1-ls.html +++ b/docs/building-module/1-ls.html @@ -559,7 +559,7 @@ room to insert those resources, then incarnate I->site.strdata.pragmas_bookmark = Packaging::bubble(I); Produce::comment(I, I"Primitives:"); - Primitives::declare_standard_set(I, Packaging::at(I)); + Primitives::declare_standard_set(I, Packaging::at(I)); LargeScale::package_type(I, I"_plain"); To ensure this is the first emitted ptype LargeScale::package_type(I, I"_code"); And this the second diff --git a/docs/building-module/2-eis.html b/docs/building-module/2-eis.html index 9df7718a4..5184f6225 100644 --- a/docs/building-module/2-eis.html +++ b/docs/building-module/2-eis.html @@ -606,7 +606,7 @@ changed back again very soon after. (n->expression_tokens->inline_command == combine_ISINC)) argc++; argc++; } - inter_ti BIP = Primitives::BIP_for_indirect_call_returning_value(argc); + inter_ti BIP = Primitives::BIP_for_indirect_call_returning_value(argc); Produce::inv_primitive(I, BIP); } @@ -628,7 +628,7 @@ somewhere (in fact, always in a property value). InterSchemas::throw_error(node, I"too many arguments for call-message"); return; } - inter_ti BIP = Primitives::BIP_for_indirect_call_returning_value(argc); + inter_ti BIP = Primitives::BIP_for_indirect_call_returning_value(argc); Produce::inv_primitive(I, BIP); Produce::down(I); for (; at; at=at->next_node) EIS_RECURSE(at, VAL_PRIM_CAT); @@ -907,7 +907,7 @@ For example, the schema .{-la if (at) { int argc = 0; for (inter_schema_node *n = at; n; n=n->next_node) argc++; - inter_ti BIP = Primitives::BIP_for_message_send(argc); + inter_ti BIP = Primitives::BIP_for_message_send(argc); Produce::inv_primitive(I, BIP); Produce::down(I); for (; at; at=at->next_node) EIS_RECURSE(at, VAL_PRIM_CAT); @@ -983,7 +983,7 @@ is not present in standard Inform 6 syntax.) Produce::val_symbol(I, K_value, OBJECT_TY_s); } int pc = VAL_PRIM_CAT; - if (Primitives::term_category(node->isn_clarifier, 0) == REF_PRIM_CAT) + if (Primitives::term_category(node->isn_clarifier, 0) == REF_PRIM_CAT) pc = REF_PRIM_CAT; EIS_RECURSE(node->child_node, pc); if (I6Operators::arity(node->isn_clarifier) == 2) @@ -1010,13 +1010,13 @@ on others. if (node->isn_clarifier == OBJECTLOOP_BIP) { Handle OBJECTLOOP as a special case3.1.11.1; } else { - int arity = Primitives::term_count(node->isn_clarifier); + int arity = Primitives::term_count(node->isn_clarifier); if (arity > 0) { Produce::down(I); inter_schema_node *at = node->child_node; inter_schema_node *last = NULL; for (int i = 0; ((at) && (i<arity)); i++) { - EIS_RECURSE(at, Primitives::term_category(node->isn_clarifier, i)); + EIS_RECURSE(at, Primitives::term_category(node->isn_clarifier, i)); last = at; at = at->next_node; } diff --git a/docs/building-module/3-prd.html b/docs/building-module/3-prd.html index 40869ee32..06ba78b90 100644 --- a/docs/building-module/3-prd.html +++ b/docs/building-module/3-prd.html @@ -361,7 +361,7 @@ internal error to halt the compiler if they occur.

-void Produce::guard(inter_error_message *ERR) {
+void Produce::guard(inter_error_message *ERR) {
     if ((ERR) && (problem_count == 0)) {
         Inter::Errors::issue(ERR); internal_error("inter error");
     }
@@ -482,8 +482,8 @@ three uses. First, primitives:
 
 
 void Produce::inv_primitive(inter_tree *I, inter_ti bip) {
-    inter_symbol *prim_symb = Primitives::from_BIP(I, bip);
-    if ((Primitives::takes_code_blocks(bip)) &&
+    inter_symbol *prim_symb = Primitives::from_BIP(I, bip);
+    if ((Primitives::takes_code_blocks(bip)) &&
         (bip != CASE_BIP) && (bip != DEFAULT_BIP))
         Produce::note_level_of_newly_opening_code_block(I);
     Produce::guard(Inter::Inv::new_primitive(Produce::at(I),
@@ -556,7 +556,7 @@ three uses. First, primitives:
 }
 
 void Produce::inv_indirect_call(inter_tree *I, int arity) {
-    Produce::inv_primitive(I, Primitives::BIP_for_indirect_call_returning_value(arity));
+    Produce::inv_primitive(I, Primitives::BIP_for_indirect_call_returning_value(arity));
 }
 

§29. Instructions for changing the primitive category: diff --git a/docs/building-test/1-ut.html b/docs/building-test/1-ut.html index 5475866fd..581d6a2b6 100644 --- a/docs/building-test/1-ut.html +++ b/docs/building-test/1-ut.html @@ -59,7 +59,7 @@ function togglePopup(material_id) { void Unit::run(filename *F) { inter_tree *dummy = InterTree::new(); inter_bookmark IBM = InterBookmark::at_start_of_this_repository(dummy); - Primitives::declare_standard_set(dummy, &IBM); + Primitives::declare_standard_set(dummy, &IBM); Streams::enable_debugging(STDOUT); text_stream *FORMER_DL = DL; DL = STDOUT; diff --git a/docs/bytecode-module/2-ann.html b/docs/bytecode-module/2-ann.html index cf6ec9461..ebc941595 100644 --- a/docs/bytecode-module/2-ann.html +++ b/docs/bytecode-module/2-ann.html @@ -73,7 +73,7 @@ function togglePopup(material_id) {

To mark symbols up with metadata.

-
+

§1. The possible annotations. Each annotation marks a symbol with a choice of inter_annotation_form and an associated value. That value can be of three possible data types: boolean @@ -212,61 +212,82 @@ any symbol: it's used to mean "do not make an annotation". SymbolAnnotation::declare(SOURCE_ORDER_IANN, I"__source_order", INTEGER_IATYPE); }

-

§5. API for making annotations.

+

§5. This is printed when inter is run with the -annotations switch. +

+ +
+void SymbolAnnotation::show_annotations(OUTPUT_STREAM) {
+    WRITE("  Code     Annotation              Type of value\n");
+    for (int ID=0; ID<MAX_IAFS; ID++) {
+        inter_annotation_form *IC = iafs_registered[ID];
+        if ((IC) && (ID != INVALID_IANN)) {
+            WRITE("  %4x     %S", ID, IC->annotation_keyword);
+            for (int j = Str::len(IC->annotation_keyword); j<24; j++) PUT(' ');
+            switch (IC->iatype) {
+                case BOOLEAN_IATYPE: WRITE("none (boolean)\n"); break;
+                case INTEGER_IATYPE: WRITE("integer\n"); break;
+                case TEXTUAL_IATYPE: WRITE("text\n"); break;
+                default: WRITE("unknown type\n"); break;
+            }
+        }
+    }
+}
+
+

§6. API for making annotations.

 void SymbolAnnotation::set_b(inter_symbol *S, inter_ti annot_ID, inter_ti n) {
     if ((n != FALSE) && (n != TRUE)) internal_error("non-boolean annotation value");
-    inter_annotation IA = SymbolAnnotation::from_pair(annot_ID, n);
-    SymbolAnnotation::set(BOOLEAN_IATYPE, S, IA);
+    inter_annotation IA = SymbolAnnotation::from_pair(annot_ID, n);
+    SymbolAnnotation::set(BOOLEAN_IATYPE, S, IA);
 }
 
 void SymbolAnnotation::set_i(inter_symbol *S, inter_ti annot_ID, inter_ti n) {
-    inter_annotation IA = SymbolAnnotation::from_pair(annot_ID, n);
-    SymbolAnnotation::set(INTEGER_IATYPE, S, IA);
+    inter_annotation IA = SymbolAnnotation::from_pair(annot_ID, n);
+    SymbolAnnotation::set(INTEGER_IATYPE, S, IA);
 }
 
 void SymbolAnnotation::set_t(inter_tree *I, inter_package *owner, inter_symbol *S,
     inter_ti annot_ID, text_stream *text) {
     inter_ti n = InterWarehouse::create_text(InterTree::warehouse(I), owner);
     Str::copy(InterWarehouse::get_text(InterTree::warehouse(I), n), text);
-    inter_annotation IA = SymbolAnnotation::from_pair(annot_ID, n);
-    SymbolAnnotation::set(TEXTUAL_IATYPE, S, IA);
+    inter_annotation IA = SymbolAnnotation::from_pair(annot_ID, n);
+    SymbolAnnotation::set(TEXTUAL_IATYPE, S, IA);
 }
 
-void SymbolAnnotation::set(int iatype, inter_symbol *S, inter_annotation IA) {
+void SymbolAnnotation::set(int iatype, inter_symbol *S, inter_annotation IA) {
     if (S == NULL) internal_error("annotated null symbol");
     if (iatype == -1) iatype = IA.annot->iatype;
-    SymbolAnnotation::write_to_set(iatype, &(S->annotations), IA);
+    SymbolAnnotation::write_to_set(iatype, &(S->annotations), IA);
 }
 
-

§6. API for reading annotations. An important convention here is that the default value for a boolean annotation +

§7. API for reading annotations. An important convention here is that the default value for a boolean annotation is FALSE, whereas for an integer it is -1.

 int SymbolAnnotation::get_b(const inter_symbol *S, inter_ti ID) {
     int found = FALSE;
-    inter_ti val = SymbolAnnotation::read_from_set(BOOLEAN_IATYPE, &(S->annotations), ID, &found);
+    inter_ti val = SymbolAnnotation::read_from_set(BOOLEAN_IATYPE, &(S->annotations), ID, &found);
     if (found) return (int) val;
     return FALSE;
 }
 
 int SymbolAnnotation::get_i(const inter_symbol *S, inter_ti ID) {
     int found = FALSE;
-    inter_ti val = SymbolAnnotation::read_from_set(INTEGER_IATYPE, &(S->annotations), ID, &found);
+    inter_ti val = SymbolAnnotation::read_from_set(INTEGER_IATYPE, &(S->annotations), ID, &found);
     if (found) return (int) val;
     return -1;
 }
 
 text_stream *SymbolAnnotation::get_t(inter_symbol *S, inter_tree *I, inter_ti ID) {
     int found = FALSE;
-    inter_ti val = SymbolAnnotation::read_from_set(TEXTUAL_IATYPE, &(S->annotations), ID, &found);
+    inter_ti val = SymbolAnnotation::read_from_set(TEXTUAL_IATYPE, &(S->annotations), ID, &found);
     if (found) return InterWarehouse::get_text(InterTree::warehouse(I), val);
     return NULL;
 }
 
-

§7. Internal representation. We can express an annotation either with an inter_annotation structure or +

§8. Internal representation. We can express an annotation either with an inter_annotation structure or with a pair of inter_ti values:

@@ -283,7 +304,7 @@ with a pair of inter_ti return IA; } -inter_annotation SymbolAnnotation::invalid_annotation(void) { +inter_annotation SymbolAnnotation::invalid_annotation(void) { inter_annotation IA; IA.annot = invalid_IAF; IA.annot_value = 0; @@ -296,18 +317,18 @@ with a pair of inter_ti}
  • The structure inter_annotation is accessed in 3/dfn, 3/iibf and here.
-

§8. Conversions: +

§9. Conversions:

-inter_annotation SymbolAnnotation::from_pair(inter_ti c1, inter_ti c2) {
+inter_annotation SymbolAnnotation::from_pair(inter_ti c1, inter_ti c2) {
     if ((iafs_registered_initialised) && (c1 < MAX_IAFS) && (iafs_registered[c1])) {
         inter_annotation IA;
         IA.annot = iafs_registered[c1];
         IA.annot_value = c2;
         return IA;
     }
-    return SymbolAnnotation::invalid_annotation();
+    return SymbolAnnotation::invalid_annotation();
 }
 
 void SymbolAnnotation::to_pair(inter_annotation IA, inter_ti *c1, inter_ti *c2) {
@@ -315,7 +336,7 @@ with a pair of inter_ti    *c2 = IA.annot_value;
 }
 
-

§9. An "annotation set" is what it sounds like: a set (with no meaningful sequence) +

§10. An "annotation set" is what it sounds like: a set (with no meaningful sequence) containing annotations. Each annotation ID can occur at most once during the set. A set is initially empty. Each inter_symbol has an annotation set, but they are also used when parsing textual Inter, which is why we don't assume that we @@ -332,7 +353,7 @@ others in a linked list whose ordering has no meaning. struct linked_list *other_annotations; of inter_annotation } inter_annotation_set; -inter_annotation_set SymbolAnnotation::new_annotation_set(void) { +inter_annotation_set SymbolAnnotation::new_annotation_set(void) { inter_annotation_set set; set.boolean_annotations = 0; set.other_annotations = NULL; @@ -348,13 +369,13 @@ others in a linked list whose ordering has no meaning. }

  • The structure inter_annotation_set is accessed in 3/iibf and here.
-

§10. To write an annotation to a set. Note that it is legal to write an annotation +

§11. To write an annotation to a set. Note that it is legal to write an annotation which the set already has: in that case, the new value replaces the old one. So writing __arrow_count=12 and then __arrow_count=7 results in a value of 7.

-void SymbolAnnotation::write_to_set(int iatype, inter_annotation_set *set, inter_annotation A) {
+void SymbolAnnotation::write_to_set(int iatype, inter_annotation_set *set, inter_annotation A) {
     if (A.annot->annotation_ID == INVALID_IANN) internal_error("added invalid annotation");
     if (iatype != A.annot->iatype) {
         WRITE_TO(STDERR, "Annotation %S (%d) should have type %d but used %d\n",
@@ -382,13 +403,13 @@ So writing __arrow_count=12    }
 }
 
-

§11. To read an annotation. found is set to TRUE if the annotation exists for +

§12. To read an annotation. found is set to TRUE if the annotation exists for the set, and FALSE otherwise. Note that every set contains all of the boolean annotations, since they are stored in a bitmap which is always present.

-inter_ti SymbolAnnotation::read_from_set(int iatype, const inter_annotation_set *set,
+inter_ti SymbolAnnotation::read_from_set(int iatype, const inter_annotation_set *set,
     inter_ti ID, int *found) {
     if ((iafs_registered_initialised == FALSE) || (ID >= MAX_IAFS)) {
         *found = FALSE;
@@ -419,7 +440,7 @@ annotations, since they are stored in a bitmap which is always present.
     return 0;
 }
 
-

§12. After parsing some annotations in textual Inter, and forming a set of those, +

§13. After parsing some annotations in textual Inter, and forming a set of those, we then want to impose these on some new symbol:

@@ -430,29 +451,29 @@ we then want to impose these on some new symbol: if (set->other_annotations) { inter_annotation *A; LOOP_OVER_LINKED_LIST(A, inter_annotation, set->other_annotations) - SymbolAnnotation::set(A->annot->iatype, S, *A); + SymbolAnnotation::set(A->annot->iatype, S, *A); } } } -

§13. Annotation sets can be written out as text. Note that booleans are only written +

§14. Annotation sets can be written out as text. Note that booleans are only written if true, because if false then they are indistinguishable from not being there at all.

 void SymbolAnnotation::write_annotations(OUTPUT_STREAM, inter_tree_node *F, inter_symbol *S) {
-    if (S) SymbolAnnotation::write_set(OUT, &(S->annotations), F);
+    if (S) SymbolAnnotation::write_set(OUT, &(S->annotations), F);
 }
 
 void SymbolAnnotation::write_set(OUTPUT_STREAM, inter_annotation_set *set, inter_tree_node *F) {
     if (set) {
         for (int b=1, c=0; c<31; b *= 2, c++)
             if (set->boolean_annotations & b)
-                SymbolAnnotation::write_annotation(OUT, F, SymbolAnnotation::from_pair((inter_ti) c, TRUE));
+                SymbolAnnotation::write_annotation(OUT, F, SymbolAnnotation::from_pair((inter_ti) c, TRUE));
         if (set->other_annotations) {
             inter_annotation *A;
             LOOP_OVER_LINKED_LIST(A, inter_annotation, set->other_annotations)
-                SymbolAnnotation::write_annotation(OUT, F, *A);
+                SymbolAnnotation::write_annotation(OUT, F, *A);
         }
     }
 }
@@ -473,11 +494,11 @@ if true, because if false then they are indistinguishable from not being there a
     }
 }
 
-

§14. And annotations can also be parsed, with the same syntax: +

§15. And annotations can also be parsed, with the same syntax:

-inter_annotation SymbolAnnotation::read_annotation(inter_tree *I, text_stream *text,
+inter_annotation SymbolAnnotation::read_annotation(inter_tree *I, text_stream *text,
     inter_error_location *eloc, inter_error_message **E) {
     inter_ti val = TRUE;
     int iatype = BOOLEAN_IATYPE;
@@ -513,7 +534,7 @@ if true, because if false then they are indistinguishable from not being there a
             return IA;
         }
     *E = Inter::Errors::plain(I"unrecognised annotation", eloc);
-    return SymbolAnnotation::invalid_annotation();
+    return SymbolAnnotation::invalid_annotation();
 }