Commit 7d67159b by Ville Voutilainen Committed by Ville Voutilainen

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
parent 9b2bf368
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
......
......@@ -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))
......
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
......
// 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" }
......@@ -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';
......
......@@ -10,7 +10,7 @@ public:
}
CVector<long> g() const
{
CVector<long> v();
return v;
CVector<long> v2();
return v2;
}
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment