aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/class.c7
-rw-r--r--gcc/cp/pt.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/ptrmem8.C15
-rw-r--r--gcc/testsuite/g++.dg/template/spec40.C12
6 files changed, 46 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a8bd6b2..6c1384a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-16 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * class.c (resolve_address_of_overloaded_function): Don't emit an
+ inform if the matching permerror returns false.
+ * pt.c (check_specialization_namespace): Likewise.
+
2018-07-16 Jakub Jelinek <jakub@redhat.com>
PR c++/3698
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 8d8339c..3d155a5 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -7919,10 +7919,11 @@ resolve_address_of_overloaded_function (tree target_type,
if (!(complain & tf_error))
return error_mark_node;
- permerror (input_location, "assuming pointer to member %qD", fn);
- if (!explained)
+ if (permerror (input_location, "assuming pointer to member %qD", fn)
+ && !explained)
{
- inform (input_location, "(a pointer to member can only be formed with %<&%E%>)", fn);
+ inform (input_location, "(a pointer to member can only be "
+ "formed with %<&%E%>)", fn);
explained = 1;
}
}
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 9de9f50..b49dce0 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -800,10 +800,10 @@ check_specialization_namespace (tree tmpl)
return true;
else
{
- permerror (input_location,
- "specialization of %qD in different namespace", tmpl);
- inform (DECL_SOURCE_LOCATION (tmpl),
- " from definition of %q#D", tmpl);
+ if (permerror (input_location,
+ "specialization of %qD in different namespace", tmpl))
+ inform (DECL_SOURCE_LOCATION (tmpl),
+ " from definition of %q#D", tmpl);
return false;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index de2d369..4abf541 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-07-16 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * g++.dg/template/spec40.C: New.
+ * g++.dg/parse/ptrmem8.C: Likewise.
+
2018-07-16 Ilya Leoshkevich <iii@linux.ibm.com>
* gcc.target/s390/mnop-mcount-m31-fpic.c: New testcase.
diff --git a/gcc/testsuite/g++.dg/parse/ptrmem8.C b/gcc/testsuite/g++.dg/parse/ptrmem8.C
new file mode 100644
index 0000000..00be3df
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ptrmem8.C
@@ -0,0 +1,15 @@
+// { dg-options "-fpermissive -w" }
+
+struct A
+{
+ template<int> void foo()
+ {
+ void (A::* fp)();
+ fp = A::foo<0>; // { dg-bogus "pointer to member" }
+ }
+};
+
+void bar()
+{
+ A().foo<0>();
+}
diff --git a/gcc/testsuite/g++.dg/template/spec40.C b/gcc/testsuite/g++.dg/template/spec40.C
new file mode 100644
index 0000000..4e29944
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/spec40.C
@@ -0,0 +1,12 @@
+// { dg-options "-fpermissive -w" }
+
+namespace N {
+ template <typename T>
+ struct S {
+ void f() {} // { dg-bogus "from definition" }
+ };
+}
+
+namespace K {
+ template <> void N::S<char>::f() {}
+}