Fix PR c++/69961 (invalid ctor call with dependent args)

gcc/cp/ChangeLog:

	PR c++/68948
	PR c++/69961
	* pt.c (tsubst_baselink): Reinstate the check for an invalid
	constructor call.

gcc/testsuite/ChangeLog:

	PR c++/69961
	* g++.dg/template/pr69961a.C: New test.
	* g++.dg/template/pr69961b.C: New test.

From-SVN: r233838
This commit is contained in:
Patrick Palka 2016-03-01 01:24:44 +00:00
parent 7168133a37
commit 76d881bfdd
5 changed files with 62 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2016-03-01 Patrick Palka <ppalka@gcc.gnu.org>
PR c++/68948
PR c++/69961
* pt.c (tsubst_baselink): Reinstate the check for an invalid
constructor call.
2016-02-28 Jason Merrill <jason@redhat.com>
PR c++/69995

View File

@ -13622,7 +13622,15 @@ tsubst_baselink (tree baselink, tree object_type,
name = mangle_conv_op_name_for_type (optype);
baselink = lookup_fnfields (qualifying_scope, name, /*protect=*/1);
if (!baselink)
return error_mark_node;
{
if (constructor_name_p (name, qualifying_scope))
{
if (complain & tf_error)
error ("cannot call constructor %<%T::%D%> directly",
qualifying_scope, name);
}
return error_mark_node;
}
/* If lookup found a single function, mark it as used at this
point. (If it lookup found multiple functions the one selected

View File

@ -1,3 +1,9 @@
2016-03-01 Patrick Palka <ppalka@gcc.gnu.org>
PR c++/69961
* g++.dg/template/pr69961a.C: New test.
* g++.dg/template/pr69961b.C: New test.
2016-02-29 David Malcolm <dmalcolm@redhat.com>
PR preprocessor/69985

View File

@ -0,0 +1,25 @@
// PR c++/69961
// { dg-do compile { target c++11 } }
#include <string>
using std::string;
class Format {
public:
explicit Format(string formatted) {}
string buffer;
};
string StrCat(const string& a) {
return "";
}
template <typename... AV>
Format Message(string msg, const AV&... args) {
return Format::Format(StrCat(msg, args...)); // { dg-error "cannot call constructor" }
}
int main(int, char**) {
Message("msg");
}

View File

@ -0,0 +1,15 @@
// PR c++/69961
struct A { A (int); };
template <typename T>
void foo ()
{
A::A ((T)0); // { dg-error "cannot call constructor .A::A. directly" }
}
void
bar ()
{
foo<int> ();
}