diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2025-03-16 13:35:58 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2025-03-16 13:35:58 -0400 |
| commit | 469b1e067961e021e7860f70919b574c142d1f40 (patch) | |
| tree | cd696be4b66550669c883075fd41a6bbd2a26eaa /parse.c | |
| parent | f51acef40e8297d7bd41b774413aa8331ca946ed (diff) | |
Fixes for opaque external structs
Diffstat (limited to 'parse.c')
| -rw-r--r-- | parse.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -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) { |
