diff options
author | Patrick Palka <ppalka@gcc.gnu.org> | 2016-03-01 01:24:44 +0000 |
---|---|---|
committer | Patrick Palka <ppalka@gcc.gnu.org> | 2016-03-01 01:24:44 +0000 |
commit | 76d881bfdde273435570ac45dca11e46b27763d0 (patch) | |
tree | 2d98873d48f01b32358a9133eb43aabdd880d778 | |
parent | 7168133a372e15373f3687d9b5e01ce24a954de9 (diff) | |
download | gcc-76d881bfdde273435570ac45dca11e46b27763d0.zip gcc-76d881bfdde273435570ac45dca11e46b27763d0.tar.gz gcc-76d881bfdde273435570ac45dca11e46b27763d0.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr69961a.C | 25 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr69961b.C | 15 |
5 files changed, 62 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 49ca2f2..04e1426 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b5855a8..b3681be 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 50c4aa9..38c7381 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/template/pr69961a.C b/gcc/testsuite/g++.dg/template/pr69961a.C new file mode 100644 index 0000000..b0c5d41 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr69961a.C @@ -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"); +} diff --git a/gcc/testsuite/g++.dg/template/pr69961b.C b/gcc/testsuite/g++.dg/template/pr69961b.C new file mode 100644 index 0000000..5fff1c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr69961b.C @@ -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> (); +} |