diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/nontype-class27.C | 15 |
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>(); } |