aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-05-25 17:03:07 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-05-25 17:03:07 -0400
commitd9338471b91bbe6e1579088c7d40ab257ac3764d (patch)
tree97053fdc89d47552fdc5cc2938a2c33fcea48fe7
parent99dcfb5fc184d4eeb2753ae9475bda4d58266161 (diff)
downloadgcc-d9338471b91bbe6e1579088c7d40ab257ac3764d.zip
gcc-d9338471b91bbe6e1579088c7d40ab257ac3764d.tar.gz
gcc-d9338471b91bbe6e1579088c7d40ab257ac3764d.tar.bz2
PR c++/85815 - reference to member of enclosing template.
* search.c (lookup_base): Use currently_open_class. (lookup_member): Use it regardless of -fconcepts. * parser.c (cp_parser_postfix_dot_deref_expression): Check it. From-SVN: r260782
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/class.c4
-rw-r--r--gcc/cp/parser.c5
-rw-r--r--gcc/cp/search.c5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-dependent1.C19
5 files changed, 31 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9c2548d..58fc696 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2018-05-25 Jason Merrill <jason@redhat.com>
+ PR c++/85815 - reference to member of enclosing template.
+ * search.c (lookup_base): Use currently_open_class.
+ (lookup_member): Use it regardless of -fconcepts.
+ * parser.c (cp_parser_postfix_dot_deref_expression): Check it.
+
CWG 616, 1213 - value category of subobject references.
* tree.c (lvalue_kind): Fix handling of ARRAY_REF of pointer.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index a17c8ed..ab68b9b 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -7462,8 +7462,8 @@ pop_class_stack (void)
--current_class_stack[current_class_depth - 1].hidden;
}
-/* Returns 1 if the class type currently being defined is either T or
- a nested type of T. Returns the type from the current_class_stack,
+/* If the class type currently being defined is either T or
+ a nested type of T, returns the type from the current_class_stack,
which might be equivalent to but not equal to T in case of
constrained partial specializations. */
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index f5a6d94..d17beb8 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -7488,10 +7488,7 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser,
access (5.2.5) outside the member function body. */
if (postfix_expression != current_class_ref
&& scope != error_mark_node
- && !(processing_template_decl
- && current_class_type
- && (same_type_ignoring_top_level_qualifiers_p
- (scope, current_class_type))))
+ && !currently_open_class (scope))
{
scope = complete_type (scope);
if (!COMPLETE_TYPE_P (scope)
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index e343a15..c2860b0 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -192,6 +192,9 @@ lookup_base (tree t, tree base, base_access access,
else
{
t = complete_type (TYPE_MAIN_VARIANT (t));
+ if (dependent_type_p (t))
+ if (tree open = currently_open_class (t))
+ t = open;
t_binfo = TYPE_BINFO (t);
}
@@ -1117,7 +1120,7 @@ lookup_member (tree xbasetype, tree name, int protect, bool want_type,
/* Make sure we're looking for a member of the current instantiation in the
right partial specialization. */
- if (flag_concepts && dependent_type_p (type))
+ if (dependent_type_p (type))
if (tree t = currently_open_class (type))
type = t;
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-dependent1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-dependent1.C
new file mode 100644
index 0000000..6fd2bb3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-dependent1.C
@@ -0,0 +1,19 @@
+// PR c++/85815
+// { dg-do compile { target c++11 } }
+
+template<class T>
+class A {
+ static A* INSTANCE;
+ void foobar();
+ void moo() {}
+};
+
+template<class T>
+A<T>* A<T>::INSTANCE = nullptr;
+
+template<class T>
+void A<T>::foobar() {
+ auto x = []() {
+ INSTANCE->moo();
+ };
+}