* 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
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.
--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. */
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)
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);
}
/* 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;
--- /dev/null
+// 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();
+ };
+}