[PATCH] [MSVC] Improved lookup into dependent/non-dependent bases of dependent class

Bataev, Alexey a.bataev at hotmail.com
Fri Feb 6 03:09:06 PST 2015


Richard, I got it, thanks.

Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team

06.02.2015 0:54, Richard Smith пишет:
> On Thu, Feb 5, 2015 at 4:45 AM, Alexey Bataev <a.bataev at hotmail.com 
> <mailto:a.bataev at hotmail.com>> wrote:
>
>     Richard, Reid,
>     Thanks for the review!
>
>
>     ================
>     Comment at: lib/AST/Type.cpp:1894-1900
>     @@ -1893,5 +1893,9 @@
>
>      TagDecl *TagType::getDecl() const {
>        return getInterestingTagDecl(decl);
>      }
>
>     +TagDecl *TagType::getDecl() {
>     +  return getInterestingTagDecl(decl);
>     +}
>     +
>     ----------------
>     rsmith wrote:
>     > What's the purpose of this change? We'll call the `const`
>     version for a non-const object without this, which will do the
>     same thing.
>     Removed.
>
>     ================
>     Comment at: lib/Sema/SemaDecl.cpp:132
>     @@ +131,3 @@
>     +namespace {
>     +enum BasesLookupResult { NotFound, FoundNotType, FoundType };
>     +} // namespace
>     ----------------
>     rsmith wrote:
>     > rnk wrote:
>     > > "FoundNonType" would be closer to the standardese terminology
>     of "non-type template parameter"
>     > This should either be an enum class or should use a prefix for
>     its names; these identifiers seem too general to drop into global
>     scope here.
>     Turned enum into enum class and renamed FoundNotType to
>     FoundNonTypeTemplateParam
>
>     ================
>     Comment at: lib/Sema/SemaDecl.cpp:139
>     @@ +138,3 @@
>     +/// type decl, \a FoundType if only type decls are found.
>     +static BasesLookupResult lookupInBases(Sema &S, const
>     IdentifierInfo &II,
>     +                                       SourceLocation NameLoc,
>     ----------------
>     rsmith wrote:
>     > The name of this function should mention something about
>     dependent bases, since that's what's interesting about it and how
>     it differs from normal name lookup.
>     Renamed to lookupUnqualifiedTypeNameInDependentBase
>
>     ================
>     Comment at: lib/Sema/SemaDecl.cpp:153
>     @@ +152,3 @@
>     + /*LookupKind=*/Sema::LookupAnyName);
>     +        if (!S.LookupQualifiedName(LR, DC) &&
>     +            LR.getResultKind() == LookupResult::NotFound)
>     ----------------
>     rsmith wrote:
>     > You're going to lengths to ensure we look up into dependent
>     bases of dependent bases, but you don't support finding names in
>     dependent bases of non-dependent bases of dependent bases: we'll
>     use normal name lookup here in that case. Maybe remove this whole
>     case and do the same thing you do below: look up into the
>     RecordDecl you get here and then recurse to its base classes.
>     Hmm, maybe I'm missing something, but is it possible at all? How
>     non-dependent class may have dependent base?
>
>
> The base class may be part of the current instantiation:
>
> template<typename T> struct A { typedef int type; };
> template<typename T> struct B : A<T> {
>   struct C;
> };
> template<typename T> struct B<T>::C : B {
>   void f() {
>     type x;
>   }
> };
>
> Here, B<T> is a non-dependent base class of B<T>::C, because it is 
> part of the same "current instantiation" (that is, whenever you're 
> instantiating that definition of B<T>::C, you must also have an 
> instantiation of the primary template of B<T>).
>
>     ================
>     Comment at: lib/Sema/SemaDecl.cpp:159-160
>     @@ +158,4 @@
>     +        FoundTypeDecl = FoundType;
>     +      }
>     +    } else if (auto *TST =
>     +  Base.getType()->getAs<TemplateSpecializationType>()) {
>     ----------------
>     rnk wrote:
>     > You can reduce the indentation here with continue.
>     Ok
>
>     ================
>     Comment at: lib/Sema/SemaDecl.cpp:173-187
>     @@ +172,17 @@
>     +        continue;
>     +      switch (lookupInBases(S, II, NameLoc, BasePrimaryTemplate)) {
>     +      case FoundNotType:
>     +        return FoundNotType;
>     +      case FoundType:
>     +        FoundTypeDecl = FoundType;
>     +        break;
>     +      case NotFound:
>     +        break;
>     +      }
>     +      for (NamedDecl *ND : BasePrimaryTemplate->lookup(&II)) {
>     +        if (!isa<TypeDecl>(ND))
>     +          return FoundNotType;
>     +        FoundTypeDecl = FoundType;
>     +      }
>     +    }
>     +  }
>     ----------------
>     rsmith wrote:
>     > Switch these two over: first look up in the base class itself,
>     and then look up in its base classes if you find nothing.
>     Otherwise you'll get the wrong result if the name is a type in one
>     place and a non-type in the other.
>     Ok, got it.
>
>     ================
>     Comment at: lib/Sema/SemaDecl.cpp:196-202
>     @@ -133,13 +195,9 @@
>      SourceLocation NameLoc) {
>        // Find the first parent class template context, if any.
>     -  // FIXME: Perform the lookup in all enclosing class templates.
>        const CXXRecordDecl *RD = nullptr;
>        for (DeclContext *DC = S.CurContext; DC; DC = DC->getParent()) {
>          RD = dyn_cast<CXXRecordDecl>(DC);
>          if (RD && RD->getDescribedClassTemplate())
>            break;
>        }
>        // Look for type decls in dependent base classes that have
>     known primary
>     ----------------
>     rsmith wrote:
>     > If there are multiple such base classes, we should ideally
>     search outer ones if we find nothing in the innermost one, to
>     match normal unqualified lookup.
>     Agree, will be fixed
>
>     ================
>     Comment at: test/SemaTemplate/ms-lookup-template-base-classes.cpp:411
>     @@ -392,2 +410,3 @@
>     +C<int> c; // expected-note {{in instantiation of template class
>     'type_in_base_of_multiple_dependent_bases::C<int>' requested here}}
>      }
>
>     ----------------
>     rnk wrote:
>     > Can you add a test for the case where we look through
>     non-dependent bases? So far as I can tell, these are all dependent.
>     Test in 'namespace type_in_base_of_dependent_base' checks this
>     already. But I'll add another one.
>
>     http://reviews.llvm.org/D7173
>
>     EMAIL PREFERENCES
>     http://reviews.llvm.org/settings/panel/emailpreferences/
>
>
>





More information about the cfe-commits mailing list