digitalmars.D.bugs - [Bug 151] New: Pragma without ';' results in undefined symbols
- d-bugmail puremagic.com May 23 2006
- d-bugmail puremagic.com May 24 2006
- Thomas Kuehne <thomas-dloop kuehne.cn> May 24 2006
- "Chris Miller" <chris dprogramming.com> May 24 2006
- Stewart Gordon <smjg_1998 yahoo.com> May 30 2006
- d-bugmail puremagic.com May 25 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=151 Summary: Pragma without ';' results in undefined symbols Product: D Version: 0.157 Platform: PC OS/Version: Windows Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: bugzilla digitalmars.com ReportedBy: lio lunesu.comtype main.d
pragma(lib,"ws2_32.lib")//; class bla{} void main(){}dmd main.d
OPTLINK (R) for Win32 Release 7.50B1 Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved main.obj(main) Error 42: Symbol Undefined __Class_4main3bla --- errorlevel 1 --
May 23 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=151 smjg iname.com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |smjg iname.com ------- Comment #1 from smjg iname.com 2006-05-24 09:38 ------- If the semicolon is omitted, then the pragma modifies the declaration or statement that immediately follows it, in this case the class bla. But it would appear from the spec that pragma(lib) is valid only on its own. It is indeed absurd that it behaves as it does, but in reality (AIUI) it shouldn't compile at all. --
May 24 2006
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 d-bugmail puremagic.com schrieb am 2006-05-23:http://d.puremagic.com/bugzilla/show_bug.cgi?id=151type main.d
pragma(lib,"ws2_32.lib")//; class bla{} void main(){}dmd main.d
OPTLINK (R) for Win32 Release 7.50B1 Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved main.obj(main) Error 42: Symbol Undefined __Class_4main3bla --- errorlevel 1
While "pragma(lib, "ws2_32.lib") class Blah{}" [A] is clearly illegal, "pragma(lib, "ws2_32.lib") class Blah{};" [B] is legal but buggy. http://www.dstress.com/d/pragma.html :pragma(ident) declaration; // influence one declaration
Thus [B] should provide the symbols of ws2_32.lib only to the Blah class. I'd opt to state that "lib" and "msg" influence neither declarations nor statements, thus prohibiting: pragma(msg, "123") statement; pragma(msg, "123") declaration; pragma(msg, "123") { statement } pragma(msg, "123") { declaration } pragma(msg, "123"): declaration; pragma(lib, "123") statement; pragma(lib, "123") declaration; pragma(lib, "123") { statement } pragma(lib, "123") { declaration } pragma(lib, "123"): declaration; Added to DStress as http://dstress.kuehne.cn/nocompile/p/pragma_07_A.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFEdDSR3w+/yD4P9tIRAiuzAJ9jcptNccs5ZfxvXlIr6njY8+JDIwCgjE7w 9GuEnjtq5PAQSpnLJieM5+M= =Xziv -----END PGP SIGNATURE-----
May 24 2006
On Wed, 24 May 2006 12:31:15 -0400, Thomas Kuehne <thomas-dloop kuehne.cn> wrote:While "pragma(lib, "ws2_32.lib") class Blah{}" [A] is clearly illegal, "pragma(lib, "ws2_32.lib") class Blah{};" [B] is legal but buggy. http://www.dstress.com/d/pragma.html :pragma(ident) declaration; // influence one declaration
Doesn't seem right, notice: pragma(ident) // influence block of declarations { declaration; declaration; } doesn't have ";" after the block. Anyway, the way you say wouldn't be consistent with other things, like "extern(C) void foo() {}" doesn't need ";" after. Plus, would that extra ";" have any significance? seems like it would only require extra work in the compiler to enforce. I think "pragma(ident) declaration; // influence one declaration" should not include the ";" and it was only typed in there by habit and/or to look like valid code.
May 24 2006
Chris Miller wrote:On Wed, 24 May 2006 12:31:15 -0400, Thomas Kuehne <thomas-dloop kuehne.cn> wrote:While "pragma(lib, "ws2_32.lib") class Blah{}" [A] is clearly illegal, "pragma(lib, "ws2_32.lib") class Blah{};" [B] is legal but buggy. http://www.dstress.com/d/pragma.html :pragma(ident) declaration; // influence one declaration
Doesn't seem right, notice: pragma(ident) // influence block of declarations { declaration; declaration; }
Yes, that bit of the spec is rather loose. It seems it was intended to illustrate, rather than to specify, with the semicolons there merely to make them look like those declarations that happen to end with one.doesn't have ";" after the block. Anyway, the way you say wouldn't be consistent with other things, like "extern(C) void foo() {}" doesn't need ";" after. Plus, would that extra ";" have any significance?
The syntax for pragmas is incomplete in the spec. But the trailing ";" in Thomas's snippet is separate from both the class definition and the pragma. It's a null DeclDef, allowed by the spec only at module level. It appears that the point is to lighten the load for people coming from C(++), where a semicolon is required after a struct, union, class or enum definition. Stewart.
May 30 2006
http://d.puremagic.com/bugzilla/show_bug.cgi?id=151 bugzilla digitalmars.com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |FIXED ------- Comment #2 from bugzilla digitalmars.com 2006-05-25 04:24 ------- Fixed 0.158 --
May 25 2006









d-bugmail puremagic.com 