public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Nathaniel Shead <nathanieloshead@gmail.com>
To: Nathan Sidwell <nathan@acm.org>
Cc: gcc-patches@gcc.gnu.org, Jason Merrill <jason@redhat.com>
Subject: Re: [PATCH] c++: Check module attachment instead of purview when necessary [PR112631]
Date: Mon, 27 Nov 2023 15:59:39 +1100	[thread overview]
Message-ID: <65642242.170a0220.8bb8e.28e1@mx.google.com> (raw)
In-Reply-To: <dfe10dcc-113c-4dda-8128-59220e71f2b4@acm.org>

On Thu, Nov 23, 2023 at 03:03:37PM -0500, Nathan Sidwell wrote:
> On 11/20/23 04:47, Nathaniel Shead wrote:
> > Bootstrapped and regtested on x86_64-pc-linux-gnu. I don't have write
> > access.
> > 
> > -- >8 --
> > 
> > Block-scope declarations of functions or extern values are not allowed
> > when attached to a named module. Similarly, class member functions are
> > not inline if attached to a named module. However, in both these cases
> > we currently only check if the declaration is within the module purview;
> > it is possible for such a declaration to occur within the module purview
> > but not be attached to a named module (e.g. in an 'extern "C++"' block).
> > This patch makes the required adjustments.
> 
> 
> Ah I'd been puzzling over the default inlinedness of  member-fns of
> block-scope structs.  Could you augment the testcase to make sure that's
> right too?
> 
> Something like:
> 
> // dg-module-do link
> export module Mod;
> 
> export auto Get () {
>   struct X { void Fn () {} };
>   return X();
> }
> 
> 
> ///
> import Mod
> void Frob () { Get().Fn(); }
> 

I gave this a try and it indeed doesn't work correctly; 'Fn' needs to be
marked 'inline' for this to link (whether or not 'Get' itself is
inline). I've tried tracing the code to work out what's going on but
I've been struggling to work out how all the different flags (e.g.
TREE_PUBLIC, TREE_EXTERNAL, TREE_COMDAT, DECL_NOT_REALLY_EXTERN)
interact, which flags we want to be set where, and where the decision of
what function definitions to emit is actually made.

I did find that doing 'mark_used(decl)' on all member functions in
block-scope structs seems to work however, but I wonder if that's maybe
too aggressive or if there's something else we should be doing?

  reply	other threads:[~2023-11-27  4:59 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-20  9:47 Nathaniel Shead
2023-11-23 20:03 ` Nathan Sidwell
2023-11-27  4:59   ` Nathaniel Shead [this message]
2024-03-08  2:55     ` [PATCH v2] c++: Check module attachment instead of just " Nathaniel Shead
2024-03-08 15:19       ` Jason Merrill
2024-03-08 23:18         ` Nathaniel Shead
2024-03-11 18:13           ` Jason Merrill
2024-03-16 11:23             ` [PATCH v3] c++: Fix handling of no-linkage decls for modules Nathaniel Shead
2024-03-19  0:58               ` Jason Merrill

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=65642242.170a0220.8bb8e.28e1@mx.google.com \
    --to=nathanieloshead@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jason@redhat.com \
    --cc=nathan@acm.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).