[PATCH] [PR c++/84973] don't defer output of uninstantiated templates

Jason Merrill jason@redhat.com
Fri Mar 23 16:32:00 GMT 2018


OK.

On Fri, Mar 23, 2018 at 11:28 AM, Alexandre Oliva <aoliva@redhat.com> wrote:
> When an anon struct gets a name through a typedef, we reset its
> linkage and that of its members.  Member functions may get vague
> linkage, which schedules them for deferred output, but we don't want
> to add them to the queue if they're uninstantiated templates,
> e.g. because the enclosing function is a template.  They will be added
> as needed when the enclosing template is instantiated.
>
> Regstrapped on i686- and x86_64-linux-gnu.  Ok to install?
>
> for  gcc/cp/ChangeLog
>
>         PR c++/84973
>         * decl2.c (note_vague_linkage_fn): Don't defer uninstantiated
>         templates.
>
> for  gcc/testsuite/ChangeLog
>
>         PR c++/84973
>         * g++.dg/template/pr84973.C: New.
>         * g++.dg/template/pr84973-2.C: New.
>         * g++.dg/template/pr84973-3.C: New.
> ---
>  gcc/cp/decl2.c                            |    3 +++
>  gcc/testsuite/g++.dg/template/pr84973-2.C |   13 +++++++++++++
>  gcc/testsuite/g++.dg/template/pr84973-3.C |   13 +++++++++++++
>  gcc/testsuite/g++.dg/template/pr84973.C   |    8 ++++++++
>  4 files changed, 37 insertions(+)
>  create mode 100644 gcc/testsuite/g++.dg/template/pr84973-2.C
>  create mode 100644 gcc/testsuite/g++.dg/template/pr84973-3.C
>  create mode 100644 gcc/testsuite/g++.dg/template/pr84973.C
>
> diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
> index e522b9ebe55a..fa753749e1a6 100644
> --- a/gcc/cp/decl2.c
> +++ b/gcc/cp/decl2.c
> @@ -739,6 +739,9 @@ check_classfn (tree ctype, tree function, tree template_parms)
>  void
>  note_vague_linkage_fn (tree decl)
>  {
> +  if (processing_template_decl)
> +    return;
> +
>    DECL_DEFER_OUTPUT (decl) = 1;
>    vec_safe_push (deferred_fns, decl);
>  }
> diff --git a/gcc/testsuite/g++.dg/template/pr84973-2.C b/gcc/testsuite/g++.dg/template/pr84973-2.C
> new file mode 100644
> index 000000000000..41c205ad5243
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/template/pr84973-2.C
> @@ -0,0 +1,13 @@
> +// { dg-do compile }
> +
> +template <int> void a() {
> +  typedef struct {
> +    void b() try { b; } catch (short) { // { dg-error "invalid use" }
> +    }
> +  } c;
> +}
> +
> +int
> +main() {
> +  a<0>();
> +}
> diff --git a/gcc/testsuite/g++.dg/template/pr84973-3.C b/gcc/testsuite/g++.dg/template/pr84973-3.C
> new file mode 100644
> index 000000000000..eeac214f2e1b
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/template/pr84973-3.C
> @@ -0,0 +1,13 @@
> +// { dg-do link }
> +
> +template <int> void a() {
> +  typedef struct {
> +    void b() try { b(); } catch (short) {
> +    }
> +  } c;
> +}
> +
> +int
> +main() {
> +  a<0>();
> +}
> diff --git a/gcc/testsuite/g++.dg/template/pr84973.C b/gcc/testsuite/g++.dg/template/pr84973.C
> new file mode 100644
> index 000000000000..b3f7170bc0dc
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/template/pr84973.C
> @@ -0,0 +1,8 @@
> +// { dg-do compile }
> +
> +template <int> void a() {
> +  typedef struct {
> +    void b() try { b; } catch (short) {
> +    }
> +  } c;
> +}
>
> --
> Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
> You must be the change you wish to see in the world. -- Gandhi
> Be Free! -- http://FSFLA.org/   FSF Latin America board member
> Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer



More information about the Gcc-patches mailing list