[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
Sat Apr 30 04:42:37 PDT 2016
ogoffart created this revision.
ogoffart added reviewers: cfe-commits, rsmith.
This code should be an error:
void foo(int);
void f3() {
int foo(float);
{
float foo(int); // expected-error {{functions that differ only in their return type cannot be overloaded}}
}
}
the foo(float) function declared at function scope should not hide the float(int) while trying to redeclare functions.
http://reviews.llvm.org/D19763
Files:
lib/Sema/SemaLookup.cpp
test/SemaCXX/function-redecl.cpp
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 {
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);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D19763.55712.patch
Type: text/x-patch
Size: 2385 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160430/0aa5b6de/attachment.bin>
More information about the cfe-commits
mailing list