[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