re PR c++/69855 (Missing diagnostic for overload that only differs by return type)
authorVille Voutilainen <ville.voutilainen@gmail.com>
Fri, 27 May 2016 14:59:01 +0000 (17:59 +0300)
committerVille Voutilainen <ville@gcc.gnu.org>
Fri, 27 May 2016 14:59:01 +0000 (17:59 +0300)
/cp
PR c++/69855
* name-lookup.c (pushdecl_maybe_friend_1): Push local function
decls into the global scope after stripping template bits
and setting DECL_ANTICIPATED.

/testsuite
PR c++/69855
* g++.dg/overload/69855.C: New.
* g++.old-deja/g++.law/missed-error2.C: Adjust.
* g++.old-deja/g++.pt/crash3.C: Likewise.

From-SVN: r236826

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/overload/69855.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.law/missed-error2.C
gcc/testsuite/g++.old-deja/g++.pt/crash3.C

index 770f817eecafa50b60db33e7366bfe63bd74be32..6c07df156bd2ee98f1cf31bff9426f0a587d9748 100644 (file)
@@ -1,3 +1,10 @@
+2016-05-27  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       PR c++/69855
+       * name-lookup.c (pushdecl_maybe_friend_1): Push local function
+       decls into the global scope after stripping template bits
+       and setting DECL_ANTICIPATED.
+
 2016-05-26  Jakub Jelinek  <jakub@redhat.com>
 
        * semantics.c (finish_omp_clauses) <case OMP_CLAUSE_SCHEDULE>: Warn
index eb128db5733a4e5534ffa2830bf3fb71922ef005..568c75e80e4390448802688dc73f3f7521b0e92a 100644 (file)
@@ -929,6 +929,24 @@ pushdecl_maybe_friend_1 (tree x, bool is_friend)
              DECL_ANTICIPATED (t) = 1;
              DECL_HIDDEN_FRIEND_P (t) = 1;
            }
+
+         if (TREE_CODE (x) == FUNCTION_DECL
+             && DECL_LOCAL_FUNCTION_P (x)
+             && !DECL_OMP_DECLARE_REDUCTION_P (x)
+             && !type_dependent_expression_p (x))
+           {
+             /* PR c++/69855, a local function declaration
+                is stripped from template info and pushed to
+                the local scope as a hidden declaration. This
+                allows ill-formed overloads even in other scopes
+                to be diagnosed both at the local declaration site
+                and after it.  */
+             tree t2 = copy_decl (t);
+             DECL_USE_TEMPLATE (t2) = 0;
+             DECL_TEMPLATE_INFO (t2) = NULL_TREE;
+             DECL_ANTICIPATED (t2) = 1;
+             push_overloaded_decl (t2, PUSH_GLOBAL, is_friend);
+           }
        }
 
       if (t != x || DECL_FUNCTION_TEMPLATE_P (t))
index 70b372510a9b3993197d202fb5b1210f1faf3958..00c2a99aaea9731c5b5edfd9d1fef507ab71e0b8 100644 (file)
@@ -1,3 +1,10 @@
+2016-05-27  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       PR c++/69855
+       * g++.dg/overload/69855.C: New.
+       * g++.old-deja/g++.law/missed-error2.C: Adjust.
+       * g++.old-deja/g++.pt/crash3.C: Likewise.
+
 2016-05-27  Jiong Wang  <jiong.wang@arm.com>
 
        PR target/63596
diff --git a/gcc/testsuite/g++.dg/overload/69855.C b/gcc/testsuite/g++.dg/overload/69855.C
new file mode 100644 (file)
index 0000000..dc2d733
--- /dev/null
@@ -0,0 +1,44 @@
+// PR c++/69855
+// { dg-do compile }
+
+int get();
+void f() {
+  char get(); // { dg-error "ambiguating" }
+}
+
+int get2();
+char get2(int);
+void f2() {
+  char get2(); // { dg-error "ambiguating" }
+}
+
+char get3(int);
+void f3() {
+  char get3();
+}
+
+void f4() {
+  char get4();
+}
+int get4(); // { dg-error "ambiguating" }
+
+void get5();
+
+template <class T> struct X
+{
+  void g()
+  {
+    int get5(); // { dg-error "ambiguating" }
+  }
+};
+
+
+template <class T> struct X2
+{
+  void g()
+  {
+    int get6();
+  }
+};
+
+void get6(); // { dg-error "ambiguating" }
index 42f70aeb997d6188b96fa8c89ea555237a85d746..26ae87d7a2e0930fbed5732e740ea109eb5d200f 100644 (file)
@@ -25,9 +25,10 @@ int main() {
    foo(4, -37, 14.39, 14.38);
 }
 
-// 971006 we no longer give an error for this since we emit a hard error
-// about the declaration above
-static void foo(int i, int j, double x, double y) { 
+// 971006 we no longer gave an error for this since we emit a hard error
+// about the declaration above, but after the fix for PR c++/69855
+// this declaration emits a diagnostic again
+static void foo(int i, int j, double x, double y) { // { dg-error "extern|static" }
 
    std::cout << "Max(int): " << max(i,j) << " Max(double): " <<
 max(x,y) << '\n';
index 160cbe541a112a1b433ae6114900315bfec3264a..2ba61d9cdb973a20586798d258da62b3db3369a8 100644 (file)
@@ -10,7 +10,7 @@ public:
     }
     CVector<long> g() const
     {
-       CVector<long> v();
-       return v;
+       CVector<long> v2();
+       return v2;
     }
 };