diff options
author | Jason Merrill <jason@redhat.com> | 2016-08-04 12:06:09 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-08-04 12:06:09 -0400 |
commit | 99676625e65ff23339115525f01a4a7a82e8ac3a (patch) | |
tree | 5637119cfcf0bcee6f44bd9687f53a18072bf622 /gcc | |
parent | c3f2032729e60c1d991c18ef56ec863322fe58ca (diff) | |
download | gcc-99676625e65ff23339115525f01a4a7a82e8ac3a.zip gcc-99676625e65ff23339115525f01a4a7a82e8ac3a.tar.gz gcc-99676625e65ff23339115525f01a4a7a82e8ac3a.tar.bz2 |
PR c++/72796 - wrong resolution of scoped method call.
* typeck.c (finish_class_member_access_expr): Avoid stripping
SCOPE_REF to dependent base.
From-SVN: r239136
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/dependent-base2.C | 18 |
3 files changed, 25 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4c2b1157..f8de78c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-08-04 Jason Merrill <jason@redhat.com> + + PR c++/72796 + * typeck.c (finish_class_member_access_expr): Avoid stripping + SCOPE_REF to dependent base. + 2016-08-04 Thomas Schwinge <thomas@codesourcery.com> * parser.c (cp_ensure_no_oacc_routine): Improve diagnostics. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index d4bfb11..78d443b 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -2683,7 +2683,7 @@ finish_class_member_access_expr (cp_expr object, tree name, bool template_p, { dependent: return build_min_nt_loc (UNKNOWN_LOCATION, COMPONENT_REF, - orig_object, name, NULL_TREE); + orig_object, orig_name, NULL_TREE); } object = build_non_dependent_expr (object); } diff --git a/gcc/testsuite/g++.dg/template/dependent-base2.C b/gcc/testsuite/g++.dg/template/dependent-base2.C new file mode 100644 index 0000000..b418832 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-base2.C @@ -0,0 +1,18 @@ +// PR c++/72796 +// { dg-do compile { target c++11 } } + +struct a; +template <int> struct b { typedef a c; }; +struct d { + void e(int); +}; +struct a : d { + void e(int) = delete; +}; +template <int f> struct g : b<f>::c { + g(int) { this->d::e(0); } +}; +struct h : g<0> { + using i = g; + h() : i(0) {} +}; |