diff --git a/changelog.md b/changelog.md index b9671147f08f9..bc48f9f687657 100644 --- a/changelog.md +++ b/changelog.md @@ -19,6 +19,8 @@ errors. - With `-d:nimPreviewAsmSemSymbol`, backticked symbols are type checked in the `asm/emit` statements. +- `importc` no longer implies `nodecl` for imported types. Use `header` or `nodecl` pragmas so that it doesn't generate a declaration for the type symbol. + ## Standard library additions and changes [//]: # "Additions:" diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index b3e03f57490f5..a408b55e88ee7 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -234,6 +234,9 @@ proc mapReturnType(conf: ConfigRef; typ: PType): TCTypeKind = proc isImportedType(t: PType): bool = result = t.sym != nil and sfImportc in t.sym.flags +proc isNoDeclType(t: PType): bool = + result = t.sym != nil and {lfNoDecl, lfHeader} * t.sym.loc.flags != {} + proc isImportedCppType(t: PType): bool = let x = t.skipTypes(irrelevantForBackend) result = (t.sym != nil and sfInfixCall in t.sym.flags) or @@ -390,7 +393,7 @@ proc getTypeForward(m: BModule; typ: PType; sig: SigHash): Rope = of tySequence, tyTuple, tyObject: result = getTypeName(m, typ, sig) m.forwTypeCache[sig] = result - if not isImportedType(concrete): + if not isNoDeclType(concrete): addForwardStructFormat(m, structOrUnion(typ), result) else: pushType(m, concrete) @@ -1043,14 +1046,14 @@ proc getTypeDescAux(m: BModule; origTyp: PType, check: var IntSet; kind: TypeDes if result == "": result = getTypeName(m, origTyp, sig) m.forwTypeCache[sig] = result - if not isImportedType(t): + if not isNoDeclType(t): addForwardStructFormat(m, structOrUnion(t), result) assert m.forwTypeCache[sig] == result m.typeCache[sig] = result # always call for sideeffects: if not incompleteType(t): let recdesc = if t.kind != tyTuple: getRecordDesc(m, t, result, check) else: getTupleDesc(m, t, result, check) - if not isImportedType(t): + if not isImportedType(t) and not isNoDeclType(t): m.s[cfsTypes].add(recdesc) elif tfIncompleteStruct notin t.flags: discard # addAbiCheck(m, t, result) # already handled elsewhere diff --git a/lib/std/sysrand.nim b/lib/std/sysrand.nim index fe9571a30b62d..9c8768dddbd26 100644 --- a/lib/std/sysrand.nim +++ b/lib/std/sysrand.nim @@ -238,7 +238,7 @@ elif defined(ios) or defined(macosx): const errSecSuccess = 0 ## No error. type - SecRandom {.importc: "struct __SecRandom".} = object + SecRandom {.importc: "struct __SecRandom", header: "".} = object SecRandomRef = ptr SecRandom ## An abstract Core Foundation-type object containing information about a random number generator. diff --git a/lib/system/dyncalls.nim b/lib/system/dyncalls.nim index 817f7d8a5f535..5c38828702cd0 100644 --- a/lib/system/dyncalls.nim +++ b/lib/system/dyncalls.nim @@ -113,13 +113,13 @@ elif defined(windows) or defined(dos): # when defined(cpp): type - THINSTANCE {.importc: "HINSTANCE".} = object + THINSTANCE {.importc: "HINSTANCE", nodecl.} = object x: pointer proc getProcAddress(lib: THINSTANCE, name: cstring): ProcAddr {. importcpp: "(void*)GetProcAddress(@)", header: "", stdcall.} else: type - THINSTANCE {.importc: "HINSTANCE".} = pointer + THINSTANCE {.importc: "HINSTANCE", nodecl.} = pointer proc getProcAddress(lib: THINSTANCE, name: cstring): ProcAddr {. importc: "GetProcAddress", header: "", stdcall.} diff --git a/tests/arc/t14472.nim b/tests/arc/t14472.nim index bb6897f2df3a1..984ecaf66fba1 100644 --- a/tests/arc/t14472.nim +++ b/tests/arc/t14472.nim @@ -30,11 +30,11 @@ var s = bork() import tables type - cdbl {.importc: "double".} = object + cdbl {.importc: "double", nodecl.} = object MyObject = ref object of RootObj y: Table[string, cdbl] - + proc test = var x = new(MyObject) diff --git a/tests/ccgbugs/tcgbug.nim b/tests/ccgbugs/tcgbug.nim index 2eddc6fddc23e..9ce1586424b4b 100644 --- a/tests/ccgbugs/tcgbug.nim +++ b/tests/ccgbugs/tcgbug.nim @@ -140,7 +140,7 @@ block: # bug #9940 typedef struct { int base; } S; """.} - type S {.importc: "S", completeStruct.} = object + type S {.importc: "S", nodecl, completeStruct.} = object base: cint proc init(x:ptr S) = x.base = 1 diff --git a/tests/ccgbugs/tctypes.nim b/tests/ccgbugs/tctypes.nim index be6009115a9d8..741b0d7e2f39c 100644 --- a/tests/ccgbugs/tctypes.nim +++ b/tests/ccgbugs/tctypes.nim @@ -1,6 +1,6 @@ discard """ targets: "c cpp" - matrix: "--gc:refc; --gc:arc" + matrix: "--mm:refc; --mm:arc" """ # bug #7308 @@ -41,3 +41,8 @@ block: # bug #11797 proc foo3(): int32 = 2 foo(proc(): cint = foo1()) foo(proc(): int32 = foo3()) + + +block: # bug #24604 + type MyType {.importc, incompleteStruct.} = object + var v {.exportc.}: ptr MyType diff --git a/tests/cpp/tget_subsystem.nim b/tests/cpp/tget_subsystem.nim index 6fb095a3de57a..05ef9ca59cd7a 100644 --- a/tests/cpp/tget_subsystem.nim +++ b/tests/cpp/tget_subsystem.nim @@ -15,7 +15,7 @@ struct SystemManager { """.} -type Input {.importcpp: "System::Input".} = object +type Input {.importcpp: "System::Input", nodecl.} = object proc getSubsystem*[T](): ptr T {. importcpp: "SystemManager::getSubsystem<'*0>()", nodecl.} diff --git a/tests/misc/msizeof5.nim b/tests/misc/msizeof5.nim index 63573a705b2b0..43e292b10856e 100644 --- a/tests/misc/msizeof5.nim +++ b/tests/misc/msizeof5.nim @@ -26,7 +26,7 @@ template ensureCgen(T: typedesc) = var a {.volatile.}: T block: - type Foo1Alias{.importc: "struct Foo1", size: sizeof(cint).} = object + type Foo1Alias{.importc: "struct Foo1", nodecl, size: sizeof(cint).} = object a: cint ensureCgen Foo1Alias diff --git a/tests/misc/tsizeof.nim b/tests/misc/tsizeof.nim index 65756bbce7f64..d33ba8212d6d5 100644 --- a/tests/misc/tsizeof.nim +++ b/tests/misc/tsizeof.nim @@ -488,7 +488,7 @@ typedef struct{ """.} type - Foo {.importc.} = object + Foo {.importc, nodecl.} = object Bar = object b: byte @@ -549,7 +549,7 @@ doAssert alignof(MyCustomAlignObject) == 32 ########################################## type - imported_double {.importc: "double".} = object + imported_double {.importc: "double", nodecl.} = object Pod = object v* : imported_double diff --git a/tests/niminaction/Chapter8/sfml/sfml.nim b/tests/niminaction/Chapter8/sfml/sfml.nim index fea85fcd4f588..2be87b4e2e718 100644 --- a/tests/niminaction/Chapter8/sfml/sfml.nim +++ b/tests/niminaction/Chapter8/sfml/sfml.nim @@ -1,11 +1,11 @@ {.passL: "-lsfml-graphics -lsfml-system -lsfml-window".} type - VideoMode* {.importcpp: "sf::VideoMode".} = object - RenderWindowObj {.importcpp: "sf::RenderWindow".} = object + VideoMode* {.importcpp: "sf::VideoMode", nodecl.} = object + RenderWindowObj {.importcpp: "sf::RenderWindow", nodecl.} = object RenderWindow* = ptr RenderWindowObj - Color* {.importcpp: "sf::Color".} = object - Event* {.importcpp: "sf::Event".} = object + Color* {.importcpp: "sf::Color", nodecl.} = object + Event* {.importcpp: "sf::Event", nodecl.} = object {.push cdecl, header: "".} diff --git a/tests/overload/tstatic_with_converter.nim b/tests/overload/tstatic_with_converter.nim index 2bc1dfaab6744..3f8b226cd27e9 100644 --- a/tests/overload/tstatic_with_converter.nim +++ b/tests/overload/tstatic_with_converter.nim @@ -15,7 +15,7 @@ cimported set1_imported(double x) { """} -type vfloat{.importc: "cimported".} = object +type vfloat{.importc: "cimported", nodecl.} = object proc set1(a: float): vfloat {.importc: "set1_imported".}