From: Patrick Palka Date: Tue, 1 Mar 2016 01:24:44 +0000 (+0000) Subject: Fix PR c++/69961 (invalid ctor call with dependent args) X-Git-Tag: basepoints/gcc-7~683 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=76d881bfdde273435570ac45dca11e46b27763d0;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 49ca2f273fda..04e142684598 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2016-03-01 Patrick Palka + + PR c++/68948 + PR c++/69961 + * pt.c (tsubst_baselink): Reinstate the check for an invalid + constructor call. + 2016-02-28 Jason Merrill PR c++/69995 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b5855a8d13cc..b3681be9e438 100644 --- a/gcc/cp/pt.c +++ b/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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 50c4aa9e1f5a..38c738163681 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-03-01 Patrick Palka + + PR c++/69961 + * g++.dg/template/pr69961a.C: New test. + * g++.dg/template/pr69961b.C: New test. + 2016-02-29 David Malcolm PR preprocessor/69985 diff --git a/gcc/testsuite/g++.dg/template/pr69961a.C b/gcc/testsuite/g++.dg/template/pr69961a.C new file mode 100644 index 000000000000..b0c5d41b27c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr69961a.C @@ -0,0 +1,25 @@ +// PR c++/69961 +// { dg-do compile { target c++11 } } + +#include + +using std::string; + +class Format { + public: + explicit Format(string formatted) {} + string buffer; +}; + +string StrCat(const string& a) { + return ""; +} + +template +Format Message(string msg, const AV&... args) { + return Format::Format(StrCat(msg, args...)); // { dg-error "cannot call constructor" } +} + +int main(int, char**) { + Message("msg"); +} diff --git a/gcc/testsuite/g++.dg/template/pr69961b.C b/gcc/testsuite/g++.dg/template/pr69961b.C new file mode 100644 index 000000000000..5fff1c908373 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr69961b.C @@ -0,0 +1,15 @@ +// PR c++/69961 + +struct A { A (int); }; + +template +void foo () +{ + A::A ((T)0); // { dg-error "cannot call constructor .A::A. directly" } +} + +void +bar () +{ + foo (); +}