From 87c306061bc2ee538e4e6460c4491dcef41a7f00 Mon Sep 17 00:00:00 2001 From: metagn Date: Tue, 19 Nov 2024 11:49:41 +0300 Subject: [PATCH] disable weird type inference for object constructors (#24455) closes #24372, refs #20091 This was added in #20091 for some reason but doesn't actually work and only makes error messages more obscure. So for now, it's disabled. Can also be backported to 2.0 if necessary. (cherry picked from commit a610f23060b8a49d8b68e8ea3a8de92b3b1a6f2e) --- compiler/semobjconstr.nim | 13 ++++++++----- tests/errmsgs/tuninstobjconstr.nim | 11 +++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 tests/errmsgs/tuninstobjconstr.nim diff --git a/compiler/semobjconstr.nim b/compiler/semobjconstr.nim index e90e0bc810..1e4bb90ebc 100644 --- a/compiler/semobjconstr.nim +++ b/compiler/semobjconstr.nim @@ -465,11 +465,14 @@ proc semObjConstr(c: PContext, n: PNode, flags: TExprFlags; expectedType: PType if t == nil: return localErrorNode(c, result, "object constructor needs an object type") - if t.skipTypes({tyGenericInst, - tyAlias, tySink, tyOwned, tyRef}).kind != tyObject and - expectedType != nil and expectedType.skipTypes({tyGenericInst, - tyAlias, tySink, tyOwned, tyRef}).kind == tyObject: - t = expectedType + when false: + # attempted type inference for generic object types, + # doesn't work since n[0] isn't set and seems underspecified + if t.skipTypes({tyGenericInst, + tyAlias, tySink, tyOwned, tyRef}).kind != tyObject and + expectedType != nil and expectedType.skipTypes({tyGenericInst, + tyAlias, tySink, tyOwned, tyRef}).kind == tyObject: + t = expectedType t = skipTypes(t, {tyGenericInst, tyAlias, tySink, tyOwned}) if t.kind == tyRef: diff --git a/tests/errmsgs/tuninstobjconstr.nim b/tests/errmsgs/tuninstobjconstr.nim new file mode 100644 index 0000000000..5d6cac304f --- /dev/null +++ b/tests/errmsgs/tuninstobjconstr.nim @@ -0,0 +1,11 @@ +# issue #24372 + +type + Foo[T] = object + x: string + +proc initFoo(): Foo[string] = + Foo(x: "hello") #[tt.Error + ^ cannot instantiate: 'Foo[T]'; the object's generic parameters cannot be inferred and must be explicitly given]# + +discard initFoo()