Index: lib/Sema/SemaLookup.cpp =================================================================== --- lib/Sema/SemaLookup.cpp +++ lib/Sema/SemaLookup.cpp @@ -1091,23 +1091,25 @@ bool Found = false; for (; I != IEnd && S->isDeclScope(*I); ++I) { if (NamedDecl *ND = R.getAcceptableDecl(*I)) { - if (NameKind == LookupRedeclarationWithLinkage) { - // Determine whether this (or a previous) declaration is - // out-of-scope. - if (!LeftStartingScope && !Initial->isDeclScope(*I)) - LeftStartingScope = true; - - // If we found something outside of our starting scope that - // does not have linkage, skip it. If it's a template parameter, + if (NameKind == LookupRedeclarationWithLinkage && + !(*I)->isTemplateParameter()) { + // If it's a template parameter, // we still find it, so we can diagnose the invalid redeclaration. - if (LeftStartingScope && !((*I)->hasLinkage()) && - !(*I)->isTemplateParameter()) { + + // Determine whether this (or a previous) declaration is + // out-of-scope. + if (!LeftStartingScope && !Initial->isDeclScope(*I)) + LeftStartingScope = true; + + // If we found something outside of our starting scope that + // does not have linkage, skip it. + if (LeftStartingScope && !((*I)->hasLinkage())) { R.setShadowed(); continue; } + } else { + Found = true; } - - Found = true; R.addDecl(ND); } } Index: test/SemaCXX/function-redecl.cpp =================================================================== --- test/SemaCXX/function-redecl.cpp +++ test/SemaCXX/function-redecl.cpp @@ -7,7 +7,7 @@ void bar(int); // expected-note 2{{previous declaration is here}} } - void foo(int); // expected-note 2{{previous declaration is here}} + void foo(int); // expected-note 3{{previous declaration is here}} void f2() { int foo(int); // expected-error {{functions that differ only in their return type cannot be overloaded}} @@ -25,6 +25,13 @@ } } } + + void f3() { + int foo(float); + { + float foo(int); // expected-error {{functions that differ only in their return type cannot be overloaded}} + } + } } class A {