aboutsummaryrefslogtreecommitdiff
path: root/parse.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-03-16 13:35:58 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-03-16 13:35:58 -0400
commit469b1e067961e021e7860f70919b574c142d1f40 (patch)
treecd696be4b66550669c883075fd41a6bbd2a26eaa /parse.c
parentf51acef40e8297d7bd41b774413aa8331ca946ed (diff)
Fixes for opaque external structs
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/parse.c b/parse.c
index bbe8a70f..10fa97dc 100644
--- a/parse.c
+++ b/parse.c
@@ -2081,22 +2081,28 @@ PARSER(parse_struct_def) {
arg_ast_t *fields = parse_args(ctx, &pos);
whitespace(&pos);
- bool secret = false, external = false;
+ bool secret = false, external = false, opaque = false;
if (match(&pos, ";")) { // Extra flags
whitespace(&pos);
for (;;) {
- if (match_word(&pos, "secret"))
+ if (match_word(&pos, "secret")) {
secret = true;
- else if (match_word(&pos, "extern"))
+ } else if (match_word(&pos, "extern")) {
external = true;
- else
+ } else if (match_word(&pos, "opaque")) {
+ if (fields)
+ parser_err(ctx, pos-strlen("opaque"), pos, "A struct can't be opaque if it has fields defined");
+ opaque = true;
+ } else {
break;
+ }
if (!match_separator(&pos))
break;
}
}
+
expect_closing(ctx, &pos, ")", "I wasn't able to parse the rest of this struct");
ast_t *namespace = NULL;
@@ -2112,7 +2118,7 @@ PARSER(parse_struct_def) {
if (!namespace)
namespace = NewAST(ctx->file, pos, pos, Block, .statements=NULL);
return NewAST(ctx->file, start, pos, StructDef, .name=name, .fields=fields, .namespace=namespace,
- .secret=secret, .external=external);
+ .secret=secret, .external=external, .opaque=opaque);
}
PARSER(parse_enum_def) {