From 235d8723e67bbb9855fca70d23f223def43e9dc3 Mon Sep 17 00:00:00 2001 From: ppalka Date: Fri, 5 Feb 2016 14:36:44 +0000 Subject: [PATCH] Fix PR c++/68948 (wrong code generation due to invalid constructor call) gcc/cp/ChangeLog: PR c++/68948 * pt.c (tsubst_baselink): Diagnose an invalid constructor call if lookup_fnfields returns NULL_TREE and the name being looked up has the form A::A. gcc/testsuite/ChangeLog: PR c++/68948 * g++.dg/template/pr68948.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233176 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 7 +++++ gcc/cp/pt.c | 10 +++++- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/template/pr68948.C | 41 +++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/pr68948.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2b6362daf2f6..74e7cb17c0c7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2016-02-05 Patrick Palka + + PR c++/68948 + * pt.c (tsubst_baselink): Diagnose an invalid constructor call + if lookup_fnfields returns NULL_TREE and the name being looked + up has the form A::A. + 2016-02-04 Patrick Palka * constexpr.c (cxx_eval_binary_expression): Fold equality diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e7ce74c6c052..76a6019a29e9 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -13583,7 +13583,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 1288df75ad68..344b7d34f384 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-05 Patrick Palka + + PR c++/68948 + * g++.dg/template/pr68948.C: New test. + 2016-02-05 Dominik Vogt * gcc.dg/tree-ssa/ssa-dom-cse-2.c: Remove -march=z13 for s390 diff --git a/gcc/testsuite/g++.dg/template/pr68948.C b/gcc/testsuite/g++.dg/template/pr68948.C new file mode 100644 index 000000000000..3cb684417afa --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr68948.C @@ -0,0 +1,41 @@ +// PR c++/68948 + +struct B { B (); B (int); }; + +struct Time : B { }; + +/* Here, A and B are unrelated types. */ + +template +struct A +{ + void TestBody () + { + B::B (); // { dg-error "cannot call constructor .B::B." } + B::B::B (); // { dg-error "cannot call constructor .B::B." } + B::B (0); // { dg-error "cannot call constructor .B::B." } + } +}; + +/* Here, C is (indirectly) derived from B. */ + +template +struct C : Time +{ + void TestBody () + { + B::B (); // { dg-error "cannot call constructor .B::B." } + B::B::B (); // { dg-error "cannot call constructor .B::B." } + B::B (0); // { dg-error "cannot call constructor .B::B." } + Time::B (0); + } +}; + +int +main (void) +{ + A a; + C c; + a.TestBody (); + c.TestBody (); +} -- 2.47.2