diff options
author | Patrick Palka <ppalka@gcc.gnu.org> | 2016-02-05 14:36:44 +0000 |
---|---|---|
committer | Patrick Palka <ppalka@gcc.gnu.org> | 2016-02-05 14:36:44 +0000 |
commit | 76c85fbbe7bb698e56b757e5997069b569517150 (patch) | |
tree | 0181155bb6cece13a7eb6076ea743a1511e1350b /gcc | |
parent | dfcfe1846a2ee22f317ad955b87fd1a7a5ca8fe1 (diff) | |
download | gcc-76c85fbbe7bb698e56b757e5997069b569517150.zip gcc-76c85fbbe7bb698e56b757e5997069b569517150.tar.gz gcc-76c85fbbe7bb698e56b757e5997069b569517150.tar.bz2 |
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.
From-SVN: r233176
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr68948.C | 41 |
4 files changed, 62 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2b6362d..74e7cb1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2016-02-05 Patrick Palka <ppalka@gcc.gnu.org> + + 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 <ppalka@gcc.gnu.org> * constexpr.c (cxx_eval_binary_expression): Fold equality diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e7ce74c..76a6019 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 1288df7..344b7d3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-05 Patrick Palka <ppalka@gcc.gnu.org> + + PR c++/68948 + * g++.dg/template/pr68948.C: New test. + 2016-02-05 Dominik Vogt <vogt@linux.vnet.ibm.com> * 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 0000000..3cb6844 --- /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 <typename> +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 <typename g> +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<int> a; + C<int> c; + a.TestBody (); + c.TestBody (); +} |