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:
parent
7168133a37
commit
76d881bfdd
@ -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
|
||||
|
10
gcc/cp/pt.c
10
gcc/cp/pt.c
@ -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
|
||||
|
@ -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
|
||||
|
25
gcc/testsuite/g++.dg/template/pr69961a.C
Normal file
25
gcc/testsuite/g++.dg/template/pr69961a.C
Normal 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");
|
||||
}
|
15
gcc/testsuite/g++.dg/template/pr69961b.C
Normal file
15
gcc/testsuite/g++.dg/template/pr69961b.C
Normal 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> ();
|
||||
}
|
Loading…
Reference in New Issue
Block a user