From: Fariborz Jahanian Date: Fri, 12 Oct 2007 16:34:10 +0000 (+0000) Subject: Fixed a bug whereby, struct tag name matches a typedef/objc-class name X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bece4ac257d85e51d94212a51eb7405818247e7e;p=clang Fixed a bug whereby, struct tag name matches a typedef/objc-class name and hid them. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42915 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp index 0a63cb9106..7e0a51f5c5 100644 --- a/Sema/SemaDecl.cpp +++ b/Sema/SemaDecl.cpp @@ -28,12 +28,17 @@ using namespace clang; Sema::DeclTy *Sema::isTypeName(const IdentifierInfo &II, Scope *S) const { - if (Decl *IIDecl = II.getFETokenInfo()) - if (isa(IIDecl) || isa(IIDecl)) - return IIDecl; - else if (ObjcCompatibleAliasDecl *ADecl = - dyn_cast(IIDecl)) - return ADecl->getClassInterface(); + Decl *IIDecl = II.getFETokenInfo(); + // Find first occurance of none-tagged declaration + while(IIDecl && IIDecl->getIdentifierNamespace() != Decl::IDNS_Ordinary) + IIDecl = cast(IIDecl)->getNext(); + if (!IIDecl) + return 0; + if (isa(IIDecl) || isa(IIDecl)) + return IIDecl; + if (ObjcCompatibleAliasDecl *ADecl = + dyn_cast(IIDecl)) + return ADecl->getClassInterface(); return 0; } diff --git a/clang.xcodeproj/project.pbxproj b/clang.xcodeproj/project.pbxproj index b88c381faa..75d938806b 100644 --- a/clang.xcodeproj/project.pbxproj +++ b/clang.xcodeproj/project.pbxproj @@ -742,6 +742,7 @@ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */; + compatibilityVersion = "Xcode 2.4"; hasScannedForEncodings = 1; mainGroup = 08FB7794FE84155DC02AAC07 /* clang */; projectDirPath = ""; diff --git a/test/Parser/namelookup-bug-1.c b/test/Parser/namelookup-bug-1.c new file mode 100644 index 0000000000..298798c5fa --- /dev/null +++ b/test/Parser/namelookup-bug-1.c @@ -0,0 +1,7 @@ +// RUN: clang -verify %s + +typedef int Object; + +struct Object *pp; + +Object staticObject1; diff --git a/test/Parser/namelookup-bug-2.c b/test/Parser/namelookup-bug-2.c new file mode 100644 index 0000000000..443b50ab02 --- /dev/null +++ b/test/Parser/namelookup-bug-2.c @@ -0,0 +1,14 @@ +// RUN: clang -verify %s + +typedef int Object; + +struct Object {int i1; } *P; + +void foo() { + struct Object { int i2; } *X; + Object: + { + Object a; + } +} +