www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 2383] New: default arguments can implicitly access private global variables that are not visible at call site

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2383

           Summary: default arguments can implicitly access private global
                    variables that are not visible at call site
           Product: D
           Version: unspecified
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Keywords: accepts-invalid, spec
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla digitalmars.com
        ReportedBy: tomas famolsen.dk


Consider the following testcase:

------------------------
1st module:

module privateconst1;

extern(C) int rand();

private const int abc;

static this() {
  abc = rand();
}

void foo(int i = abc) {}


------------------------
2nd module:

module privateconst2;

import privateconst1;

void main()
{
  foo();
}


------
this is accepted by dmd and works. however this makes it impossible for another
compiler to mark 'abc' as internal (or in C terms, static) disabling a lot of
valuable optimizations.

in the 2nd module the call to 'foo' has to load the value of 'abc' which is
private and should not be accessible.

I can't find anywhere in the spec where it says this is allowed, hence marking
both 'spec' and 'accepts-invalid'


-- 
Oct 01 2008
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2383






It's legal because the default parameter value is evaluated in the context
where it appears, and so has access to private values where it appears. I'll
clarify the documentation.


-- 
Oct 02 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2383






-------
"The default parameter value is evaluated in the context
where it appears" - should I reopen Issue 191, then?


-- 
Oct 02 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2383






how can I detect this and still make private globals internal to the module in
the normal case ?


-- 
Oct 02 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2383






I mean in terms of DMD...


-- 
Oct 02 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2383






-------
Isn't the case just the same as the following? (I wish default args were always
semantically equivalent to this, but oh well...)

private const int abc;
void foo() { foo(abc); }
void foo(int i) {}

That shouldn't require making abc non-private, or?


-- 
Oct 02 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2383






reason I'm asking this is that DMD puts a the private global value in the AST
at the call site. thus I can't make this specific global internal and I can't
find any information to tell me that this specific global does not follow usual
symbol visibility rules.


-- 
Oct 02 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2383







 "The default parameter value is evaluated in the context
 where it appears" - should I reopen Issue 191, then?
No, because a 'this' pointer would still be needed. --
Oct 02 2008
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2383






*bump* I could really use some hints on how to fix this in LDC .. Walter? How
do you do it in DMD?

As I've already said, the callsite references the global variable, so I need
some way to figure out that this in fact is not a real private.


-- 
Oct 16 2008
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2383


bugzilla digitalmars.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED





Fixed dmd 1.036 and 2.020


-- 
Oct 20 2008