[PATCH] D19763: Functions declared in a scope should not hide previous declaration in earlier scopes
Olivier Goffart via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 16 14:46:34 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL272961: Functions declared in a scope should not hide previous declaration in earlier… (authored by ogoffart).
Changed prior to commit:
http://reviews.llvm.org/D19763?vs=55712&id=61033#toc
Repository:
rL LLVM
http://reviews.llvm.org/D19763
Files:
cfe/trunk/lib/Sema/SemaLookup.cpp
cfe/trunk/test/SemaCXX/function-redecl.cpp
Index: cfe/trunk/test/SemaCXX/function-redecl.cpp
===================================================================
--- cfe/trunk/test/SemaCXX/function-redecl.cpp
+++ cfe/trunk/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 {
Index: cfe/trunk/lib/Sema/SemaLookup.cpp
===================================================================
--- cfe/trunk/lib/Sema/SemaLookup.cpp
+++ cfe/trunk/lib/Sema/SemaLookup.cpp
@@ -1078,32 +1078,35 @@
for (; S && !isNamespaceOrTranslationUnitScope(S); S = S->getParent()) {
DeclContext *Ctx = S->getEntity();
-
+ bool SearchNamespaceScope = true;
// Check whether the IdResolver has anything in this scope.
- bool Found = false;
for (; I != IEnd && S->isDeclScope(*I); ++I) {
if (NamedDecl *ND = R.getAcceptableDecl(*I)) {
- if (NameKind == LookupRedeclarationWithLinkage) {
+ if (NameKind == LookupRedeclarationWithLinkage &&
+ !(*I)->isTemplateParameter()) {
+ // If it's a template parameter, we still find it, so we can diagnose
+ // the invalid redeclaration.
+
// 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,
- // we still find it, so we can diagnose the invalid redeclaration.
- if (LeftStartingScope && !((*I)->hasLinkage()) &&
- !(*I)->isTemplateParameter()) {
+ // does not have linkage, skip it.
+ if (LeftStartingScope && !((*I)->hasLinkage())) {
R.setShadowed();
continue;
}
+ } else {
+ // We found something in this scope, we should not look at the
+ // namespace scope
+ SearchNamespaceScope = false;
}
-
- Found = true;
R.addDecl(ND);
}
}
- if (Found) {
+ if (!SearchNamespaceScope) {
R.resolveKind();
if (S->isClassScope())
if (CXXRecordDecl *Record = dyn_cast_or_null<CXXRecordDecl>(Ctx))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D19763.61033.patch
Type: text/x-patch
Size: 2776 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160616/032813ee/attachment.bin>
More information about the cfe-commits
mailing list