aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-08-04 12:06:09 -0400
committerJason Merrill <jason@gcc.gnu.org>2016-08-04 12:06:09 -0400
commit99676625e65ff23339115525f01a4a7a82e8ac3a (patch)
tree5637119cfcf0bcee6f44bd9687f53a18072bf622 /gcc
parentc3f2032729e60c1d991c18ef56ec863322fe58ca (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/typeck.c2
-rw-r--r--gcc/testsuite/g++.dg/template/dependent-base2.C18
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) {}
+};