aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2021-01-21 10:31:36 +0100
committerIain Buclaw <ibuclaw@gdcproject.org>2021-01-21 14:54:48 +0100
commit279d3a89b79f85d07a8ac4db1bebe9f60cb549e5 (patch)
tree45e70aa6786f0a138370903a8dbc749aeb3359eb /gcc
parente154009f35a74edffda42b77b806a1fb8591d4c0 (diff)
downloadgcc-279d3a89b79f85d07a8ac4db1bebe9f60cb549e5.zip
gcc-279d3a89b79f85d07a8ac4db1bebe9f60cb549e5.tar.gz
gcc-279d3a89b79f85d07a8ac4db1bebe9f60cb549e5.tar.bz2
d: Enable private member access for __traits
The following traits can now access non-public members: - hasMember - getMember - getOverloads - getVirtualMethods - getVirtualFuntions This fixes a long-standing issue in D where the allMembers trait would correctly return non-public members but those non-public members would be inaccessible to other traits. Reviewed-on: https://github.com/dlang/dmd/pull/12135 gcc/d/ChangeLog: * dmd/MERGE: Merge upstream dmd 3a7ebef73.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/d/dmd/MERGE2
-rw-r--r--gcc/d/dmd/traits.c10
-rw-r--r--gcc/testsuite/gdc.test/compilable/imports/test15371.d9
-rw-r--r--gcc/testsuite/gdc.test/compilable/test15371.d10
4 files changed, 24 insertions, 7 deletions
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index 4f7f7a8..1f907b8 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@
-2d3d137489f030395d06cb664087fd1a35bccabe
+3a7ebef73cc01d4a877a95cf95cd3776c9e3ee66
The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository.
diff --git a/gcc/d/dmd/traits.c b/gcc/d/dmd/traits.c
index 5fd4b48..70f7f2c 100644
--- a/gcc/d/dmd/traits.c
+++ b/gcc/d/dmd/traits.c
@@ -1103,12 +1103,14 @@ Expression *semanticTraits(TraitsExp *e, Scope *sc)
return new ErrorExp();
}
+ // ignore symbol visibility and disable access checks for these traits
+ Scope *scx = sc->push();
+ scx->flags |= SCOPEignoresymbolvisibility | SCOPEnoaccesscheck;
+
if (e->ident == Id::hasMember)
{
/* Take any errors as meaning it wasn't found
*/
- Scope *scx = sc->push();
- scx->flags |= SCOPEignoresymbolvisibility;
ex = trySemantic(ex, scx);
scx->pop();
return ex ? True(e) : False(e);
@@ -1118,8 +1120,6 @@ Expression *semanticTraits(TraitsExp *e, Scope *sc)
if (ex->op == TOKdotid)
// Prevent semantic() from replacing Symbol with its initializer
((DotIdExp *)ex)->wantsym = true;
- Scope *scx = sc->push();
- scx->flags |= SCOPEignoresymbolvisibility;
ex = semantic(ex, scx);
scx->pop();
return ex;
@@ -1130,8 +1130,6 @@ Expression *semanticTraits(TraitsExp *e, Scope *sc)
{
unsigned errors = global.errors;
Expression *eorig = ex;
- Scope *scx = sc->push();
- scx->flags |= SCOPEignoresymbolvisibility;
ex = semantic(ex, scx);
if (errors < global.errors)
e->error("%s cannot be resolved", eorig->toChars());
diff --git a/gcc/testsuite/gdc.test/compilable/imports/test15371.d b/gcc/testsuite/gdc.test/compilable/imports/test15371.d
new file mode 100644
index 0000000..49b446a
--- /dev/null
+++ b/gcc/testsuite/gdc.test/compilable/imports/test15371.d
@@ -0,0 +1,9 @@
+module imports.test15371;
+
+struct A
+{
+ private int a;
+ private void fun() {}
+ private void fun(int, int) {}
+ public void fun(int) {}
+}
diff --git a/gcc/testsuite/gdc.test/compilable/test15371.d b/gcc/testsuite/gdc.test/compilable/test15371.d
new file mode 100644
index 0000000..6e762be
--- /dev/null
+++ b/gcc/testsuite/gdc.test/compilable/test15371.d
@@ -0,0 +1,10 @@
+// EXTRA_FILES: imports/test15371.d
+import imports.test15371;
+
+void main()
+{
+ A a;
+ static assert(__traits(hasMember, A, "a"));
+ static assert(__traits(getOverloads, A, "fun").length == 3);
+ static assert(__traits(compiles, __traits(getMember, a, "a") ));
+}