[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