]> granicus.if.org Git - clang/commitdiff
When we're performing name lookup for a tag, we still allow ourselves
authorDouglas Gregor <dgregor@apple.com>
Thu, 5 Jan 2012 01:11:47 +0000 (01:11 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 5 Jan 2012 01:11:47 +0000 (01:11 +0000)
to see hidden declarations because every tag lookup is effectively a
redeclaration lookup. For example, image that

  struct foo;

is declared in a submodule that is known but hasn't been imported. If
someone later writes

  struct foo *foo_p;

then "struct foo" is either a reference or a redeclaration. To keep
the redeclaration chains sound, we treat it like a redeclaration for
name-lookup purposes.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147588 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Sema/Lookup.h
lib/Sema/SemaLookup.cpp
test/Modules/Inputs/redecl-merge-top-explicit.h
test/Modules/redecl-merge.m

index 1b991cb54b96d9c214e51e297ca8814d86101370..6486e53bedd00c8233009adf4b22d083f577c3af 100644 (file)
@@ -214,6 +214,12 @@ public:
     return Redecl;
   }
 
+  /// \brief Determine whether this lookup is permitted to see hidden
+  /// declarations, such as those in modules that have not yet been imported.
+  bool isHiddenDeclarationVisible() const {
+    return Redecl || LookupKind == Sema::LookupTagName;
+  }
+  
   /// Sets whether tag declarations should be hidden by non-tag
   /// declarations during resolution.  The default is true.
   void setHideTags(bool Hide) {
@@ -286,7 +292,7 @@ public:
     if (!D->isInIdentifierNamespace(IDNS))
       return 0;
     
-    if (Redecl == Sema::ForRedeclaration || isVisible(D))
+    if (isHiddenDeclarationVisible() || isVisible(D))
       return D;
     
     return getAcceptableDeclSlow(D);
index ae950ff27aa7bd692bb5276be0a3ef0496174cbc..7ee50e3a4c1517b603308da07c83673c85dcdb04 100644 (file)
@@ -1171,7 +1171,7 @@ bool Sema::LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation) {
         
         // If this declaration is module-private and it came from an AST
         // file, we can't see it.
-        NamedDecl *D = R.isForRedeclaration()? *I : getVisibleDecl(*I);
+        NamedDecl *D = R.isHiddenDeclarationVisible()? *I : getVisibleDecl(*I);
         if (!D)
           continue;
                 
@@ -1194,7 +1194,7 @@ bool Sema::LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation) {
             if (!LastDC->isFileContext() && !S->isDeclScope(*LastI))
               break;
             
-            D = R.isForRedeclaration()? *LastI : getVisibleDecl(*LastI);
+            D = R.isHiddenDeclarationVisible()? *LastI : getVisibleDecl(*LastI);
             if (D)
               R.addDecl(D);
           }
index 54aab33e6ca4e619d012bc1509cd4c2c5bd1f38b..e06ff7aedaf040f3b298c5236ef9dbf680aa06d9 100644 (file)
@@ -5,3 +5,5 @@ int *explicit_func(void);
 struct explicit_struct { int member; };
 
 #define ONE 1
+
+typedef struct my_struct_type *my_struct_ref;
index b41986609c0133b2da61cb0d53f09aae698f3bad..09898a5b3b8a6728d582660b390eb1195ab491c5 100644 (file)
@@ -1,11 +1,11 @@
 // RUN: rm -rf %t
-// RUN: %clang_cc1 -fmodules -fmodule-cache-path %t -I %S/Inputs %s -verify
+// RUN: %clang_cc1 -fmodules -fmodule-cache-path %t -Wno-typedef-redefinition -I %S/Inputs %s -verify
 // RUN: %clang_cc1 -x objective-c++ -fmodules -fmodule-cache-path %t -I %S/Inputs %s -verify
 @class C2;
 @class C3;
 @class C3;
 @import redecl_merge_left;
-
+typedef struct my_struct_type *my_struct_ref;
 @protocol P4;
 @class C3;
 @class C3;