aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-01-19 23:37:37 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-01-19 23:37:37 +0100
commit1c9a0251aa6d1dd6d17b1c6676a77c1fdd5eda9b (patch)
tree2347d1777d6edb09aaecca8145dcef87ec9c64f9 /gcc
parent26fc730dd2b04a718f12ea5ba0aa7a8737cc513e (diff)
downloadgcc-1c9a0251aa6d1dd6d17b1c6676a77c1fdd5eda9b.zip
gcc-1c9a0251aa6d1dd6d17b1c6676a77c1fdd5eda9b.tar.gz
gcc-1c9a0251aa6d1dd6d17b1c6676a77c1fdd5eda9b.tar.bz2
re PR c++/81167 (ICE on valid C++ code in deferred_printed_type, at cp/error.c:118)
PR c++/81167 * call.c (joust): Use TREE_TYPE (source) if source is a POINTER_TYPE_P rather than if ! DECL_CONSTRUCTOR_P (w->fn). * g++.dg/cpp0x/pr81167.C: New test. From-SVN: r256905
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr81167.C24
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index eb39b40..5bad14d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2018-01-19 Jakub Jelinek <jakub@redhat.com>
+ PR c++/81167
+ * call.c (joust): Use TREE_TYPE (source) if source is
+ a POINTER_TYPE_P rather than if ! DECL_CONSTRUCTOR_P (w->fn).
+
PR c++/83919
* typeck.c (convert_for_assignment): Suppress warn_ignored_qualifiers
for direct enum init.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index e08622c..46d5ef5 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -10090,7 +10090,7 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn,
else if (warn)
{
tree source = source_type (w->convs[0]);
- if (! DECL_CONSTRUCTOR_P (w->fn))
+ if (POINTER_TYPE_P (source))
source = TREE_TYPE (source);
if (warning (OPT_Wconversion, "choosing %qD over %qD", w->fn, l->fn)
&& warning (OPT_Wconversion, " for conversion from %qH to %qI",
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d6ea61f..ceb16e5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2018-01-19 Jakub Jelinek <jakub@redhat.com>
+ PR c++/81167
+ * g++.dg/cpp0x/pr81167.C: New test.
+
PR c++/83919
* g++.dg/cpp0x/pr83919.C: New test.
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr81167.C b/gcc/testsuite/g++.dg/cpp0x/pr81167.C
new file mode 100644
index 0000000..d0c9d23
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/pr81167.C
@@ -0,0 +1,24 @@
+// PR c++/81167
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wconversion" }
+
+struct bar;
+
+struct foo
+{
+ foo () {}
+ foo (const bar &) {}
+};
+
+struct bar
+{
+ operator foo () && { return foo (); }
+};
+
+void test ()
+{
+ foo f = bar ();
+// { dg-warning "choosing 'bar::operator foo\\(\\) &&' over 'foo::foo\\(const bar&\\)'" "" { target *-*-* } .-1 }
+// { dg-warning "for conversion from 'bar' to 'foo'" "" { target *-*-* } .-2 }
+// { dg-message "because conversion sequence for the argument is better" "" { target *-*-* } .-3 }
+}