diff --git a/src/clang.zig b/src/clang.zig index 8b3a7db6d276..87c653f813cd 100644 --- a/src/clang.zig +++ b/src/clang.zig @@ -1050,6 +1050,12 @@ pub const VarDecl = opaque { pub const isStaticLocal = ZigClangVarDecl_isStaticLocal; extern fn ZigClangVarDecl_isStaticLocal(*const VarDecl) bool; + + pub const isThisDeclarationADefinition = ZigClangVarDecl_isThisDeclarationADefinition; + extern fn ZigClangVarDecl_isThisDeclarationADefinition(*const VarDecl) bool; + + pub const getDefinition = ZigClangVarDecl_getDefinition; + extern fn ZigClangVarDecl_getDefinition(*const VarDecl) ?*const VarDecl; }; pub const VectorType = opaque { diff --git a/src/translate_c.zig b/src/translate_c.zig index 301e0a219d18..0b098a9ece9a 100644 --- a/src/translate_c.zig +++ b/src/translate_c.zig @@ -572,6 +572,12 @@ fn visitVarDecl(c: *Context, var_decl: *const clang.VarDecl, mangled_name: ?[]co if (c.global_scope.sym_table.contains(var_name)) return; // Avoid processing this decl twice + // Skip this declaration if a proper definition exists + if (!var_decl.isThisDeclarationADefinition()) { + if (var_decl.getDefinition()) |def| + return visitVarDecl(c, def, mangled_name); + } + const is_pub = mangled_name == null; const is_threadlocal = var_decl.getTLSKind() != .None; const scope = &c.global_scope.base; diff --git a/src/zig_clang.cpp b/src/zig_clang.cpp index 0d10fa8c9dca..2af169486fe8 100644 --- a/src/zig_clang.cpp +++ b/src/zig_clang.cpp @@ -3310,6 +3310,16 @@ bool ZigClangVarDecl_isStaticLocal(const struct ZigClangVarDecl *self) { return casted->isStaticLocal(); } +bool ZigClangVarDecl_isThisDeclarationADefinition(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return casted->isThisDeclarationADefinition(); +} + +const ZigClangVarDecl *ZigClangVarDecl_getDefinition(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return reinterpret_cast(casted->getDefinition()); +} + enum ZigClangBuiltinTypeKind ZigClangBuiltinType_getKind(const struct ZigClangBuiltinType *self) { auto casted = reinterpret_cast(self); return (ZigClangBuiltinTypeKind)casted->getKind(); diff --git a/src/zig_clang.h b/src/zig_clang.h index 1c929ff8974f..66d5700f4cfe 100644 --- a/src/zig_clang.h +++ b/src/zig_clang.h @@ -1493,6 +1493,8 @@ ZIG_EXTERN_C const struct ZigClangAPValue *ZigClangVarDecl_evaluateValue(const s ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *); ZIG_EXTERN_C enum ZigClangStorageClass ZigClangVarDecl_getStorageClass(const struct ZigClangVarDecl *self); ZIG_EXTERN_C bool ZigClangVarDecl_isStaticLocal(const struct ZigClangVarDecl *self); +ZIG_EXTERN_C bool ZigClangVarDecl_isThisDeclarationADefinition(const struct ZigClangVarDecl *); +ZIG_EXTERN_C const ZigClangVarDecl *ZigClangVarDecl_getDefinition(const struct ZigClangVarDecl *); ZIG_EXTERN_C bool ZigClangSourceLocation_eq(struct ZigClangSourceLocation a, struct ZigClangSourceLocation b);