[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