diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-05-27 16:43:21 +0300 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-05-29 12:07:29 +0300 |
| commit | 0274e2f1fd3b7a81344080d532cfd2d384427cd2 (patch) | |
| tree | f2e882f35401602799e46b76990a9e9403e3c909 /src | |
| parent | 36b4658752257a27b1d7db5a4396132784801997 (diff) | |
| download | zig-0274e2f1fd3b7a81344080d532cfd2d384427cd2.tar.gz zig-0274e2f1fd3b7a81344080d532cfd2d384427cd2.zip | |
translate-c: check variable types being demoted to opaque
Diffstat (limited to 'src')
| -rw-r--r-- | src/translate_c.zig | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/translate_c.zig b/src/translate_c.zig index 06ccf53f63..3bbe1e6f46 100644 --- a/src/translate_c.zig +++ b/src/translate_c.zig @@ -793,6 +793,10 @@ fn visitVarDecl(c: *Context, var_decl: *const clang.VarDecl, mangled_name: ?[]co var is_extern = storage_class == .Extern and !has_init; var is_export = !is_extern and storage_class != .Static; + if (!is_extern and qualTypeWasDemotedToOpaque(c, qual_type)) { + return failDecl(c, var_decl_loc, var_name, "non-extern variable has opaque type", .{}); + } + const type_node = transQualTypeMaybeInitialized(c, scope, qual_type, decl_init, var_decl_loc) catch |err| switch (err) { error.UnsupportedTranslation, error.UnsupportedType => { return failDecl(c, var_decl_loc, var_name, "unable to resolve variable type", .{}); @@ -1839,6 +1843,7 @@ fn transDeclStmtOne( .Var => { const var_decl = @ptrCast(*const clang.VarDecl, decl); const decl_init = var_decl.getInit(); + const loc = decl.getLocation(); const qual_type = var_decl.getTypeSourceInfo_getType(); const name = try c.str(@ptrCast(*const clang.NamedDecl, var_decl).getName_bytes_begin()); @@ -1848,12 +1853,12 @@ fn transDeclStmtOne( // This is actually a global variable, put it in the global scope and reference it. // `_ = mangled_name;` return visitVarDecl(c, var_decl, mangled_name); + } else if (qualTypeWasDemotedToOpaque(c, qual_type)) { + return fail(c, error.UnsupportedTranslation, loc, "local variable has opaque type", .{}); } const is_static_local = var_decl.isStaticLocal(); const is_const = qual_type.isConstQualified(); - - const loc = decl.getLocation(); const type_node = try transQualTypeMaybeInitialized(c, scope, qual_type, decl_init, loc); var init_node = if (decl_init) |expr| |
