aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/pt.c10
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/nontype-class27.C15
4 files changed, 28 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4ccee73..b72121c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2019-12-20 Jakub Jelinek <jakub@redhat.com>
+ PR c++/92965
+ * pt.c (invalid_nontype_parm_type_p): Call structural_type_p with
+ explain=true only if emitting error.
+
PR c++/92966
* method.c (early_check_defaulted_comparison): Don't set
DECL_MAYBE_DELETED when returning false.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index e9cf46c..dc01774 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -25838,11 +25838,13 @@ invalid_nontype_parm_type_p (tree type, tsubst_flags_t complain)
return true;
if (!structural_type_p (type))
{
- auto_diagnostic_group d;
if (complain & tf_error)
- error ("%qT is not a valid type for a template non-type parameter "
- "because it is not structural", type);
- structural_type_p (type, true);
+ {
+ auto_diagnostic_group d;
+ error ("%qT is not a valid type for a template non-type "
+ "parameter because it is not structural", type);
+ structural_type_p (type, true);
+ }
return true;
}
return false;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b357e1e..9913e8a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2019-12-20 Jakub Jelinek <jakub@redhat.com>
+ PR c++/92965
+ * g++.dg/cpp2a/nontype-class27.C: New test.
+
PR c++/92966
* g++.dg/cpp2a/spaceship-eq8.C: New test.
diff --git a/gcc/testsuite/g++.dg/cpp2a/nontype-class27.C b/gcc/testsuite/g++.dg/cpp2a/nontype-class27.C
new file mode 100644
index 0000000..23eae64
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/nontype-class27.C
@@ -0,0 +1,15 @@
+// PR c++/92965
+// { dg-do compile { target c++2a } }
+
+template<int>
+class TS {
+ int x; // { dg-bogus "is not public" }
+public:
+ constexpr TS(int) {}
+};
+TS(int) -> TS<1>;
+
+template<TS> void foo() {}
+template<int> void foo() {}
+
+void test() { foo<2>(); }