From: Kaelyn Takata Date: Wed, 30 Sep 2015 18:23:35 +0000 (+0000) Subject: Don't correct non-class using declarations to class members. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3e3844fd5af8facb74f34a1b381008c7096324eb;p=clang Don't correct non-class using declarations to class members. Such declarations would be invalid anyway, and trying to make the correction will lead to a crash. Fixes PR 24781. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@248928 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index ff9c93d2f6..07bf856719 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -8031,6 +8031,10 @@ public: // FIXME: Check that the base class member is accessible? } + } else { + auto *FoundRecord = dyn_cast(ND); + if (FoundRecord && FoundRecord->isInjectedClassName()) + return false; } if (isa(ND)) diff --git a/test/SemaCXX/typo-correction.cpp b/test/SemaCXX/typo-correction.cpp index 174b1403e2..d5b42d0e53 100644 --- a/test/SemaCXX/typo-correction.cpp +++ b/test/SemaCXX/typo-correction.cpp @@ -640,3 +640,19 @@ int has_include(int); // expected-note {{'has_include' declared here}} // expected-error@+1 {{__has_include must be used within a preprocessing directive}} int foo = __has_include(42); // expected-error {{use of undeclared identifier '__has_include'; did you mean 'has_include'?}} } + +namespace PR24781_using_crash { +namespace A { +namespace B { +class Foofoo {}; // expected-note {{'A::B::Foofoo' declared here}} +} +} + +namespace C { +namespace D { +class Bar : public A::B::Foofoo {}; +} +} + +using C::D::Foofoo; // expected-error {{no member named 'Foofoo' in namespace 'PR24781_using_crash::C::D'; did you mean 'A::B::Foofoo'?}} +}