annotate dmd2/access.c @ 1452:638d16625da2

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