From: Douglas Gregor Date: Fri, 27 Mar 2009 04:21:56 +0000 (+0000) Subject: Tests and fixes for templates declared within (non-template) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=551f48c2d96c8a519feb195d34a691c8b97b3994;p=clang Tests and fixes for templates declared within (non-template) classes. Test case from Anders Carlsson, fix from Piotr Rak! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67817 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index 616ee3dd93..770f9301e6 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -600,10 +600,11 @@ Sema::CppLookupName(Scope *S, DeclarationName Name, // base classes, we never need to perform qualified lookup // because all of the members are on top of the identifier // chain. - if (isa(Ctx) && - (R = LookupQualifiedName(Ctx, Name, NameKind, RedeclarationOnly))) - return std::make_pair(true, R); - + if (isa(Ctx)) { + R = LookupQualifiedName(Ctx, Name, NameKind, RedeclarationOnly); + if (R || RedeclarationOnly) + return std::make_pair(true, R); + } if (Ctx->getParent() != Ctx->getLexicalParent()) { // It is out of line defined C++ method or struct, we continue // doing name lookup in parent context. Once we will find namespace @@ -611,8 +612,8 @@ Sema::CppLookupName(Scope *S, DeclarationName Name, // using-directives later. for (OutOfLineCtx = Ctx; OutOfLineCtx && !OutOfLineCtx->isFileContext(); OutOfLineCtx = OutOfLineCtx->getParent()) { - if ((R = LookupQualifiedName(OutOfLineCtx, Name, NameKind, - RedeclarationOnly))) + R = LookupQualifiedName(OutOfLineCtx, Name, NameKind, RedeclarationOnly); + if (R || RedeclarationOnly) return std::make_pair(true, R); } } diff --git a/test/SemaTemplate/nested-template.cpp b/test/SemaTemplate/nested-template.cpp new file mode 100644 index 0000000000..bd9e89f76a --- /dev/null +++ b/test/SemaTemplate/nested-template.cpp @@ -0,0 +1,16 @@ +// RUN: clang-cc -fsyntax-only %s + +class A; + +class S { +public: + template struct A { + struct Nested { + typedef T type; + }; + }; +}; + +int i; +S::A::Nested::type *ip = &i; +