[PATCH] c++: explicit() ignored on deduction guide [PR100065]
Jason Merrill
jason@redhat.com
Tue Jun 8 21:30:07 GMT 2021
On 6/7/21 8:06 PM, Marek Polacek wrote:
> When we have explicit() with a value-dependent argument, we can't
> evaluate it at parsing time, so cp_parser_function_specifier_opt stashes
> the argument into the decl-specifiers and grokdeclarator then stores it
> into explicit_specifier_map, which is then used when substituting the
> function decl. grokdeclarator stores it for constructors and conversion
> functions, but we also need to do it for deduction guides, otherwise
> we'll forget that we've seen an explicit-specifier as in the attached
> test.
>
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/branches?
OK.
> PR c++/100065
>
> gcc/cp/ChangeLog:
>
> * decl.c (grokdeclarator): Store a value-dependent
> explicit-specifier even for deduction guides.
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/cpp2a/explicit18.C: New test.
> ---
> gcc/cp/decl.c | 2 ++
> gcc/testsuite/g++.dg/cpp2a/explicit18.C | 23 +++++++++++++++++++++++
> 2 files changed, 25 insertions(+)
> create mode 100644 gcc/testsuite/g++.dg/cpp2a/explicit18.C
>
> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
> index a3687dbb0dd..cbf647dd569 100644
> --- a/gcc/cp/decl.c
> +++ b/gcc/cp/decl.c
> @@ -14043,6 +14043,8 @@ grokdeclarator (const cp_declarator *declarator,
> storage_class = sc_none;
> }
> }
> + if (declspecs->explicit_specifier)
> + store_explicit_specifier (decl, declspecs->explicit_specifier);
> }
> else
> {
> diff --git a/gcc/testsuite/g++.dg/cpp2a/explicit18.C b/gcc/testsuite/g++.dg/cpp2a/explicit18.C
> new file mode 100644
> index 00000000000..c8916fa4743
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp2a/explicit18.C
> @@ -0,0 +1,23 @@
> +// PR c++/100065
> +// { dg-do compile { target c++20 } }
> +
> +template<bool B>
> +struct bool_constant {
> + static constexpr bool value = B;
> + constexpr operator bool() const { return value; }
> +};
> +
> +using true_type = bool_constant<true>;
> +using false_type = bool_constant<false>;
> +
> +template<bool>
> +struct X {
> + template<typename T>
> + X(T);
> +};
> +
> +template<bool b>
> +explicit(b) X(bool_constant<b>) -> X<b>;
> +
> +X false_ = false_type{}; // OK
> +X true_ = true_type{}; // { dg-error "explicit deduction guide" }
>
> base-commit: e89759fdfc80db223bd852aba937acb2d7c2cd80
>
More information about the Gcc-patches
mailing list