Tested on Linux X86-64. Note that I have not bootstrapped this patch.
diff --git a/gcc/cp/search.c b/gcc/cp/search.c index c3eed90..6907533 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -917,9 +917,10 @@ accessible_p (tree type, tree decl, bool consider_local_p) /* Figure out where the reference is occurring. Check to see if DECL is private or protected in this scope, since that will determine whether protected access is allowed. */ - if (current_class_type) + if (current_nonlambda_class_type ()) protected_ok = protected_accessible_p (decl, - current_class_type, binfo); + current_nonlambda_class_type (), + binfo); /* Now, loop through the classes of which we are a friend. */ if (!protected_ok) diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 7e144a6..06acd4e 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1837,8 +1837,8 @@ check_accessibility_of_qualified_id (tree decl, `this'. */ if (DECL_NONSTATIC_MEMBER_P (decl) && current_class_ptr - && DERIVED_FROM_P (scope, current_class_type)) - qualifying_type = current_class_type; + && DERIVED_FROM_P (scope, current_nonlambda_class_type ())) + qualifying_type = current_nonlambda_class_type (); /* Otherwise, use the type indicated by the nested-name-specifier. */ else diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-59483.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-59483.C new file mode 100644 index 0000000..fa79df9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-59483.C @@ -0,0 +1,31 @@ +// PR c++/59483 +// { dg-do compile { target c++11 } } + +struct X +{ +protected: + int i; +}; + +struct Y : X +{ + Y() + { + [&]{ X::i = 3; }(); + } +}; + +template <class T> +struct Y2 : T +{ + Y2() + { + [&]{ T::i = 3; }(); + } +}; + +int main() +{ + Y y; + Y2<X> y2; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-61148.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-61148.C new file mode 100644 index 0000000..32bb734 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-61148.C @@ -0,0 +1,33 @@ +// PR c++/61148 +// { dg-do compile { target c++11 } } + +class DB +{ +protected: + void foo() {}; +}; + +class DC : public DB +{ +public: + DC() + { + [this]() {DB::foo();}(); + }; +}; + +template <class T> +class DC2 : public T +{ +public: + DC2() + { + [this]() {T::foo();}(); + }; +}; + +int main(void) +{ + DC x; + DC2<DB> x2; +}
pr59483_pr61148.changelog
Description: Binary data