forked from OSchip/llvm-project
Move the -fms-compatibility using decl check after real access checking
Summary: This avoids false positives from -Wmicrosoft when name lookup would normally succeed in standard C++. This triggered on a common CRTP pattern in clang, where a derived class would have a private using decl to pull in members of a dependent base: class Verifier : InstVisitor<Verifier> { private: using InstVisitor<Verifier>::visit; ... void anything() { visit(); // warned here } }; Real access checks pass here because we're in the context of the Verifier, but the -Wmicrosoft extension was just looking for the private access specifier. Reviewers: rsmith CC: cfe-commits Differential Revision: http://llvm-reviews.chandlerc.com/D2679 llvm-svn: 201019
This commit is contained in:
parent
04d6d2f2af
commit
42063b0b1c
|
@ -1420,16 +1420,15 @@ static AccessResult CheckEffectiveAccess(Sema &S,
|
|||
AccessTarget &Entity) {
|
||||
assert(Entity.getAccess() != AS_public && "called for public access!");
|
||||
|
||||
if (S.getLangOpts().MSVCCompat &&
|
||||
IsMicrosoftUsingDeclarationAccessBug(S, Loc, Entity))
|
||||
return AR_accessible;
|
||||
|
||||
switch (IsAccessible(S, EC, Entity)) {
|
||||
case AR_dependent:
|
||||
DelayDependentAccess(S, EC, Loc, Entity);
|
||||
return AR_dependent;
|
||||
|
||||
case AR_inaccessible:
|
||||
if (S.getLangOpts().MSVCCompat &&
|
||||
IsMicrosoftUsingDeclarationAccessBug(S, Loc, Entity))
|
||||
return AR_accessible;
|
||||
if (!Entity.isQuiet())
|
||||
DiagnoseBadAccess(S, Loc, EC, Entity);
|
||||
return AR_inaccessible;
|
||||
|
|
|
@ -111,6 +111,9 @@ public:
|
|||
class B : public A {
|
||||
private:
|
||||
using A::f;
|
||||
void g() {
|
||||
f(); // no diagnostic
|
||||
}
|
||||
};
|
||||
|
||||
class C : public B {
|
||||
|
|
Loading…
Reference in New Issue