aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVille Voutilainen <ville.voutilainen@gmail.com>2016-05-27 17:59:01 +0300
committerVille Voutilainen <ville@gcc.gnu.org>2016-05-27 17:59:01 +0300
commit7d67159b48803e2558f33600e2f015f4e251a3e1 (patch)
tree5a2c297fd37b69d9c6efc9a705000ebc7a8bca8b /gcc
parent9b2bf368d7983b683867656160b8f79870daeb97 (diff)
downloadgcc-7d67159b48803e2558f33600e2f015f4e251a3e1.zip
gcc-7d67159b48803e2558f33600e2f015f4e251a3e1.tar.gz
gcc-7d67159b48803e2558f33600e2f015f4e251a3e1.tar.bz2
re PR c++/69855 (Missing diagnostic for overload that only differs by return type)
/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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/name-lookup.c18
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/overload/69855.C44
-rw-r--r--gcc/testsuite/g++.old-deja/g++.law/missed-error2.C7
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/crash3.C4
6 files changed, 82 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 770f817..6c07df1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index eb128db..568c75e 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -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))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 70b3725..00c2a99 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..dc2d733
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/69855.C
@@ -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" }
diff --git a/gcc/testsuite/g++.old-deja/g++.law/missed-error2.C b/gcc/testsuite/g++.old-deja/g++.law/missed-error2.C
index 42f70ae..26ae87d 100644
--- a/gcc/testsuite/g++.old-deja/g++.law/missed-error2.C
+++ b/gcc/testsuite/g++.old-deja/g++.law/missed-error2.C
@@ -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';
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash3.C b/gcc/testsuite/g++.old-deja/g++.pt/crash3.C
index 160cbe5..2ba61d9 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/crash3.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/crash3.C
@@ -10,7 +10,7 @@ public:
}
CVector<long> g() const
{
- CVector<long> v();
- return v;
+ CVector<long> v2();
+ return v2;
}
};