Partial fix for qualified name lookup, such that the lookup of N in
N::X only skips those entities specified in C++ [basic.lookup.qual]p1.

Note that both EDG and GCC currently get this wrong. EDG has confirmed
that the bug will be fixed in a future version.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61079 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaCXXScopeSpec.cpp b/lib/Sema/SemaCXXScopeSpec.cpp
index 8b3218b..fe9ae07 100644
--- a/lib/Sema/SemaCXXScopeSpec.cpp
+++ b/lib/Sema/SemaCXXScopeSpec.cpp
@@ -28,8 +28,8 @@
       DeclContext::lookup_const_iterator I, E;

       for (llvm::tie(I, E) = LookupCtx->lookup(Context, Name); I != E; ++I) {

        IdIsUndeclared = false;

-       if (((*I)->getIdentifierNamespace() & Decl::IDNS_Tag) && 

-           !isa<EnumDecl>(*I))

+       if (((*I)->getIdentifierNamespace() & Decl::IDNS_Tag) || 

+           isa<TypedefDecl>(*I))

          return *I;

       }

 

@@ -56,12 +56,10 @@
     // not a class-name or namespace-name, the program is ill-formed.

 

     for (; I != E; ++I) {

-      if (TypedefDecl *TD = dyn_cast<TypedefDecl>(*I)) {

-        if (TD->getUnderlyingType()->isRecordType())

-          break;

-        continue;

+      if (isa<TypedefDecl>(*I)) {

+        break;

       }

-      if (((*I)->getIdentifierNamespace()&Decl::IDNS_Tag) && !isa<EnumDecl>(*I))

+      if (((*I)->getIdentifierNamespace() & Decl::IDNS_Tag))

         break;    

     }

 

@@ -100,13 +98,14 @@
 

   if (SD) {

     if (TypedefDecl *TD = dyn_cast<TypedefDecl>(SD)) {

-      assert(TD->getUnderlyingType()->isRecordType() &&"Invalid Scope Decl!");

-      SD = TD->getUnderlyingType()->getAsRecordType()->getDecl();

+      if (const RecordType* Record = TD->getUnderlyingType()->getAsRecordType())

+        return cast<DeclContext>(Record->getDecl());

+    } else if (isa<NamespaceDecl>(SD) || isa<RecordDecl>(SD)) {

+      return cast<DeclContext>(SD);

     }

 

-    assert((isa<NamespaceDecl>(SD) || isa<RecordDecl>(SD)) &&

-           "Invalid Scope Decl!");

-    return cast<DeclContext>(SD);

+    // Fall through to produce an error: we found something that isn't

+    // a class or a namespace.

   }

 

   unsigned DiagID;