annotate dmd/access.c @ 650:aa6a0b7968f7

Added test case for bug #100 Removed dubious check for not emitting static private global in other modules without access. This should be handled properly somewhere else, it's causing unresolved global errors for stuff that should work (in MiniD)
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sun, 05 Oct 2008 17:28:15 +0200
parents aaade6ded589
children b30fe7e1dbb9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
2 // Copyright (c) 1999-2006 by Digital Mars
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
3 // All Rights Reserved
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
4 // written by Walter Bright
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
5 // http://www.digitalmars.com
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
6 // License for redistribution is by either the Artistic License
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
8 // See the included readme.txt for details.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
9
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
10
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
11 #include <stdio.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
12 #include <stdlib.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
13 #include <assert.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
14
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
15 #include "root.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
16 #include "mem.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
17
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
18 #include "enum.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
19 #include "aggregate.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
20 #include "init.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
21 #include "attrib.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
22 #include "scope.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
23 #include "id.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
24 #include "mtype.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
25 #include "declaration.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
26 #include "aggregate.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
27 #include "expression.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
28 #include "module.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
29
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
30 #define LOG 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
31
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
32 /* Code to do access checks
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
33 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
34
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
35 int hasPackageAccess(Scope *sc, Dsymbol *s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
36
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
37 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
38 * Return PROT access for Dsymbol smember in this declaration.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
39 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
40
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
41 enum PROT AggregateDeclaration::getAccess(Dsymbol *smember)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
42 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
43 return PROTpublic;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
44 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
45
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
46 enum PROT StructDeclaration::getAccess(Dsymbol *smember)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
47 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
48 enum PROT access_ret = PROTnone;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
49
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
50 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
51 printf("+StructDeclaration::getAccess(this = '%s', smember = '%s')\n",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
52 toChars(), smember->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
53 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
54 if (smember->toParent() == this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
55 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
56 access_ret = smember->prot();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
57 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
58 else if (smember->isDeclaration()->isStatic())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
59 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
60 access_ret = smember->prot();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
61 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
62 return access_ret;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
63 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
64
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
65 enum PROT ClassDeclaration::getAccess(Dsymbol *smember)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
66 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
67 enum PROT access_ret = PROTnone;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
68
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
69 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
70 printf("+ClassDeclaration::getAccess(this = '%s', smember = '%s')\n",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
71 toChars(), smember->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
72 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
73 if (smember->toParent() == this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
74 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
75 access_ret = smember->prot();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
76 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
77 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
78 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
79 enum PROT access;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
80 int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
81
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
82 if (smember->isDeclaration()->isStatic())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
83 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
84 access_ret = smember->prot();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
85 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
86
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
87 for (i = 0; i < baseclasses.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
88 { BaseClass *b = (BaseClass *)baseclasses.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
89
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
90 access = b->base->getAccess(smember);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
91 switch (access)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
92 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
93 case PROTnone:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
94 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
95
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
96 case PROTprivate:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
97 access = PROTnone; // private members of base class not accessible
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
98 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
99
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
100 case PROTpackage:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
101 case PROTprotected:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
102 case PROTpublic:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
103 case PROTexport:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
104 // If access is to be tightened
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
105 if (b->protection < access)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
106 access = b->protection;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
107
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
108 // Pick path with loosest access
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
109 if (access > access_ret)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
110 access_ret = access;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
111 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
112
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
113 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
114 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
115 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
116 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
117 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
118 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
119 printf("-ClassDeclaration::getAccess(this = '%s', smember = '%s') = %d\n",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
120 toChars(), smember->toChars(), access_ret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
121 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
122 return access_ret;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
123 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
124
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
125 /********************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
126 * Helper function for ClassDeclaration::accessCheck()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
127 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
128 * 0 no access
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
129 * 1 access
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
130 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
131
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
132 static int accessCheckX(
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
133 Dsymbol *smember,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
134 Dsymbol *sfunc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
135 AggregateDeclaration *dthis,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
136 AggregateDeclaration *cdscope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
137 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
138 assert(dthis);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
139
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
140 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
141 printf("accessCheckX for %s.%s in function %s() in scope %s\n",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
142 dthis->toChars(), smember->toChars(),
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
143 sfunc ? sfunc->toChars() : "NULL",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
144 cdscope ? cdscope->toChars() : "NULL");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
145 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
146 if (dthis->hasPrivateAccess(sfunc) ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
147 dthis->isFriendOf(cdscope))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
148 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
149 if (smember->toParent() == dthis)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
150 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
151 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
152 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
153 ClassDeclaration *cdthis = dthis->isClassDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
154 if (cdthis)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
155 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
156 for (int i = 0; i < cdthis->baseclasses.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
157 { BaseClass *b = (BaseClass *)cdthis->baseclasses.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
158 enum PROT access;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
159
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
160 access = b->base->getAccess(smember);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
161 if (access >= PROTprotected ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
162 accessCheckX(smember, sfunc, b->base, cdscope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
163 )
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
164 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
165
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
166 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
167 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
168 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
169 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
170 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
171 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
172 if (smember->toParent() != dthis)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
173 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
174 ClassDeclaration *cdthis = dthis->isClassDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
175 if (cdthis)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
176 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
177 for (int i = 0; i < cdthis->baseclasses.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
178 { BaseClass *b = (BaseClass *)cdthis->baseclasses.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
179
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
180 if (accessCheckX(smember, sfunc, b->base, cdscope))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
181 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
182 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
183 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
184 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
185 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
186 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
187 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
188
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
189 /*******************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
190 * Do access check for member of this class, this class being the
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
191 * type of the 'this' pointer used to access smember.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
192 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
193
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
194 void AggregateDeclaration::accessCheck(Loc loc, Scope *sc, Dsymbol *smember)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
195 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
196 int result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
197
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
198 FuncDeclaration *f = sc->func;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
199 AggregateDeclaration *cdscope = sc->getStructClassScope();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
200 enum PROT access;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
201
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
202 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
203 printf("AggregateDeclaration::accessCheck() for %s.%s in function %s() in scope %s\n",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
204 toChars(), smember->toChars(),
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
205 f ? f->toChars() : NULL,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
206 cdscope ? cdscope->toChars() : NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
207 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
208
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
209 Dsymbol *smemberparent = smember->toParent();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
210 if (!smemberparent || !smemberparent->isAggregateDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
211 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
212 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
213 printf("not an aggregate member\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
214 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
215 return; // then it is accessible
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
216 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
217
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
218 // BUG: should enable this check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
219 //assert(smember->parent->isBaseOf(this, NULL));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
220
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
221 if (smemberparent == this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
222 { enum PROT access = smember->prot();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
223
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
224 result = access >= PROTpublic ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
225 hasPrivateAccess(f) ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
226 isFriendOf(cdscope) ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
227 (access == PROTpackage && hasPackageAccess(sc, this));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
228 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
229 printf("result1 = %d\n", result);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
230 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
231 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
232 else if ((access = this->getAccess(smember)) >= PROTpublic)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
233 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
234 result = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
235 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
236 printf("result2 = %d\n", result);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
237 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
238 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
239 else if (access == PROTpackage && hasPackageAccess(sc, this))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
240 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
241 result = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
242 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
243 printf("result3 = %d\n", result);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
244 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
245 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
246 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
247 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
248 result = accessCheckX(smember, f, this, cdscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
249 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
250 printf("result4 = %d\n", result);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
251 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
252 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
253 if (!result)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
254 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
255 error(loc, "member %s is not accessible", smember->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
256 halt();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
257 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
258 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
259
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
260 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
261 * Determine if this is the same or friend of cd.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
262 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
263
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
264 int AggregateDeclaration::isFriendOf(AggregateDeclaration *cd)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
265 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
266 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
267 printf("AggregateDeclaration::isFriendOf(this = '%s', cd = '%s')\n", toChars(), cd ? cd->toChars() : "null");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
268 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
269 if (this == cd)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
270 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
271
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
272 // Friends if both are in the same module
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
273 //if (toParent() == cd->toParent())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
274 if (cd && getModule() == cd->getModule())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
275 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
276 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
277 printf("\tin same module\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
278 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
279 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
280 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
281
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
282 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
283 printf("\tnot friend\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
284 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
285 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
286 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
287
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
288 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
289 * Determine if scope sc has package level access to s.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
290 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
291
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
292 int hasPackageAccess(Scope *sc, Dsymbol *s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
293 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
294 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
295 printf("hasPackageAccess(s = '%s', sc = '%p')\n", s->toChars(), sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
296 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
297
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
298 for (; s; s = s->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
299 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
300 if (s->isPackage() && !s->isModule())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
301 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
302 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
303 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
304 if (s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
305 printf("\tthis is in package '%s'\n", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
306 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
307
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
308 if (s && s == sc->module->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
309 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
310 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
311 printf("\ts is in same package as sc\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
312 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
313 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
314 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
315
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
316
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
317 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
318 printf("\tno package access\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
319 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
320 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
321 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
322
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
323 /**********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
324 * Determine if smember has access to private members of this declaration.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
325 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
326
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
327 int AggregateDeclaration::hasPrivateAccess(Dsymbol *smember)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
328 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
329 if (smember)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
330 { AggregateDeclaration *cd = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
331 Dsymbol *smemberparent = smember->toParent();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
332 if (smemberparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
333 cd = smemberparent->isAggregateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
334
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
335 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
336 printf("AggregateDeclaration::hasPrivateAccess(class %s, member %s)\n",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
337 toChars(), smember->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
338 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
339
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
340 if (this == cd) // smember is a member of this class
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
341 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
342 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
343 printf("\tyes 1\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
344 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
345 return 1; // so we get private access
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
346 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
347
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
348 // If both are members of the same module, grant access
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
349 while (1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
350 { Dsymbol *sp = smember->toParent();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
351 if (sp->isFuncDeclaration() && smember->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
352 smember = sp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
353 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
354 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
355 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
356 if (!cd && toParent() == smember->toParent())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
357 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
358 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
359 printf("\tyes 2\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
360 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
361 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
362 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
363 if (!cd && getModule() == smember->getModule())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
364 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
365 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
366 printf("\tyes 3\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
367 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
368 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
369 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
370 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
371 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
372 printf("\tno\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
373 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
374 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
375 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
376
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
377 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
378 * Check access to d for expression e.d
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
379 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
380
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
381 void accessCheck(Loc loc, Scope *sc, Expression *e, Declaration *d)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
382 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
383 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
384 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
385 { printf("accessCheck(%s . %s)\n", e->toChars(), d->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
386 printf("\te->type = %s\n", e->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
387 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
388 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
389 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
390 //printf("accessCheck(%s)\n", d->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
391 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
392 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
393 if (!e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
394 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
395 if (d->prot() == PROTprivate && d->getModule() != sc->module ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
396 d->prot() == PROTpackage && !hasPackageAccess(sc, d))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
397
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
398 error(loc, "%s %s.%s is not accessible from %s",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
399 d->kind(), d->getModule()->toChars(), d->toChars(), sc->module->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
400 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
401 else if (e->type->ty == Tclass)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
402 { // Do access check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
403 ClassDeclaration *cd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
404
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
405 cd = (ClassDeclaration *)(((TypeClass *)e->type)->sym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
406 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
407 if (e->op == TOKsuper)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
408 { ClassDeclaration *cd2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
409
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
410 cd2 = sc->func->toParent()->isClassDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
411 if (cd2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
412 cd = cd2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
413 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
414 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
415 cd->accessCheck(loc, sc, d);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
416 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
417 else if (e->type->ty == Tstruct)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
418 { // Do access check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
419 StructDeclaration *cd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
420
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
421 cd = (StructDeclaration *)(((TypeStruct *)e->type)->sym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
422 cd->accessCheck(loc, sc, d);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
423 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 1
diff changeset
424 }