[Issue 8104] UFCS on opaque struct won't compile

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun May 20 08:30:15 PDT 2012


http://d.puremagic.com/issues/show_bug.cgi?id=8104



--- Comment #6 from Kenji Hara <k.hara.pg at gmail.com> 2012-05-20 08:31:49 PDT ---
(In reply to comment #5)
> @Kenji: When brought up on the forum there seemed to be consensus that this was
> a bug.  http://forum.dlang.org/thread/rseaqsqosqrnirrclcic@forum.dlang.org
> 
> Why should the act of function member lookup on an opaque struct necessarily be
> an error?  It should only be an error if the member cannot be resolved.  Prior
> to UFCS, there was no way to resolve function members outside of the struct
> itself, so it made sense to raise an error directly from the struct's search
> call.

Because of function hijacking.

> At http://dlang.org/struct.html there is a section "Opaque Structs and Unions".
>  It says that the members of such a struct are hidden from the user.  It's not
> clear on what "hidden" implies though.  With respect to function members this
> documentation should be clarified:  an opaque struct behaves as if it has no
> function members.

No. opaque struct means "may or may not have members", not "has no members".
They are different.

> Note that all the errors regarding "forward reference" are misleading.  These
> structs not a forward reference, there are opaque.  It's illegal to redefine an
> opaque struct:
> 
>   struct S;
>   struct S { int foo; } // Error: struct S conflicts with struct S
> 
> Given that, what are you trying to protect the user from by disallowing UFCS on
> these structs?

I'd like to explain a use case.
---
1. module m_a has a struct S with members. module m_b imports m_a and use S.

module m_a;
struct S { void foo() { ... } ... }
S* makeS() { ... }

module m_b;
void foo(S* ps) { ... }
void main(){ auto ps = makeS(); ps.foo(); /* call S.foo */ }

2. S is changed to 'opaque struct'.
   (e.g. m_a is provided by hand-made di file.)

module m_a;
struct S;
S* makeS();

3. In module m_b, now ps.foo() accidently calls m_b.foo.
---

Additionaly, current UFCS lookup mechanism is not completely
defined/implemented.
It's debated recently (See
http://forum.dlang.org/thread/jl09ui$ii8$1@digitalmars.com), so I wouldn't like
to change/add lookup mechanism yet.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list