aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@gcc.gnu.org>2016-02-05 14:36:44 +0000
committerPatrick Palka <ppalka@gcc.gnu.org>2016-02-05 14:36:44 +0000
commit76c85fbbe7bb698e56b757e5997069b569517150 (patch)
tree0181155bb6cece13a7eb6076ea743a1511e1350b /gcc
parentdfcfe1846a2ee22f317ad955b87fd1a7a5ca8fe1 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cp/pt.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/pr68948.C41
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 ();
+}