digitalmars.D.bugs - [Issue 1399] New: Wrapping a case statement in a version statement gives a shadowing declaration error.
- d-bugmail puremagic.com (33/33) Aug 04 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1399
- BCS (4/39) Aug 05 2007 Invalid: version blocks are not a naming scope.
- d-bugmail puremagic.com (14/14) Aug 06 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1399
- d-bugmail puremagic.com (40/40) Aug 07 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1399
- BCS (4/4) Aug 07 2007 This might have something to do with an error I keep running into where ...
- d-bugmail puremagic.com (17/17) Aug 07 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1399
- d-bugmail puremagic.com (7/7) Aug 07 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1399
http://d.puremagic.com/issues/show_bug.cgi?id=1399
Summary: Wrapping a case statement in a version statement gives a
shadowing declaration error.
Product: D
Version: 1.019
Platform: PC
OS/Version: Linux
Status: NEW
Keywords: rejects-valid
Severity: normal
Priority: P2
Component: DMD
AssignedTo: bugzilla digitalmars.com
ReportedBy: aziz.kerim gmail.com
When compiling the snippet below with -version=D2 I get the following error:
"Error: shadowing declaration func.a is deprecated"
void func()
{
switch(1)
{
case 1:
auto a = 2;
break;
version(D2)
{
case 2:
auto a = 2; // error
break;
}
default:
}
}
--
Aug 04 2007
Reply to d-bugmail puremagic.com,
http://d.puremagic.com/issues/show_bug.cgi?id=1399
Summary: Wrapping a case statement in a version statement
gives a
shadowing declaration error.
Product: D
Version: 1.019
Platform: PC
OS/Version: Linux
Status: NEW
Keywords: rejects-valid
Severity: normal
Priority: P2
Component: DMD
AssignedTo: bugzilla digitalmars.com
ReportedBy: aziz.kerim gmail.com
When compiling the snippet below with -version=D2 I get the following
error: "Error: shadowing declaration func.a is deprecated"
void func()
{
switch(1)
{
case 1:
auto a = 2;
break;
version(D2)
{
case 2:
auto a = 2; // error
break;
}
default:
}
}
Invalid: version blocks are not a naming scope.
Well it might be a bug because it should be a "can't have two a's" error,
not a shadowing error
Aug 05 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1399
smjg iname.com changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |smjg iname.com
Keywords|rejects-valid |diagnostic
Indeed, the bug is that it delivers the wrong error message. The correct
message would be
bz1399.d(11): Error: declaration bz1399.func.a is already defined
However, if I get rid of the version block, the code compiles without error,
but this is due to issue 603.
And Nazo, please don't quote the entire message when replying.
--
Aug 06 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1399
I think I can explain how the compiler understands the code I provided. Stewart
has observed correctly, that when you remove the version block the code
compiles without errors. This is because every case and default block
introduces a new scope (the switch block has its own scope as well.)
The two case blocks are similar to this code:
void func()
{
// This is valid code.
{
auto a = 0;
}
{
auto a = 0;
}
}
The problem arises when you wrap the second case statement into a version
block, because then the version block plus the nested case block is contained
by the first case block. The reason for this is that the parses parses every
statement until it hits another case or default block.
The code with the version block would thus be seen by the compiler as:
void func()
{
{
auto a = 0;
{
auto a = 0; // Error: shadowing outer a
}
}
}
The following code generates the same error:
switch (1)
{
auto a = 0;
case 1:
auto a = 1; // Error: shadowing declaration
default:
}
--
Aug 07 2007
This might have something to do with an error I keep running into where if you have a static if statement with nothing but a case label, then sometime things go strange. I don't have a test case handy but I'll try to work one up sooner or later.
Aug 07 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1399
You actually don't need the version block to demonstrate this bug. This will do
as well:
switch(1)
{
case 1:
auto a = 1;
{
case 2:
auto a = 2;
}
default:
}
By the way, regarding the last code snippet I showed in my previous post: this
isn't a bug, the compiler behaves correctly.
--
Aug 07 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1399
That's different, because when it isn't the body of a CC statement, { } opens a
new scope. In this case, the compiler is behaving correctly according to the
spec as I try it.
bz1399c4.d(8): Error: shadowing declaration bz1399c4.main.a is deprecated
--
Aug 07 2007









BCS <ao pathlink.com> 