diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2021-01-21 10:31:36 +0100 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2021-01-21 14:54:48 +0100 |
commit | 279d3a89b79f85d07a8ac4db1bebe9f60cb549e5 (patch) | |
tree | 45e70aa6786f0a138370903a8dbc749aeb3359eb | |
parent | e154009f35a74edffda42b77b806a1fb8591d4c0 (diff) | |
download | gcc-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.
-rw-r--r-- | gcc/d/dmd/MERGE | 2 | ||||
-rw-r--r-- | gcc/d/dmd/traits.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gdc.test/compilable/imports/test15371.d | 9 | ||||
-rw-r--r-- | gcc/testsuite/gdc.test/compilable/test15371.d | 10 |
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") )); +} |