Bug 114917 - [modules] Explicit specialisations in export namespace not permitted
Summary: [modules] Explicit specialisations in export namespace not permitted
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 15.0
: P3 normal
Target Milestone: 15.0
Assignee: Nathaniel Shead
URL:
Keywords: accepts-invalid, rejects-valid
Depends on:
Blocks: c++-modules
  Show dependency tree / graph
 
Reported: 2024-05-02 02:08 UTC by Nathaniel Shead
Modified: 2024-09-19 07:55 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2024-05-02 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Nathaniel Shead 2024-05-02 02:08:30 UTC
Since r15-84-g79420dd3441458 we now incorrectly reject the following modules example:

  export module M;
  export namespace ns {
    template <typename T> void foo() {}
    template <> void foo<int>() {}
  }

Relatedly, we also incorrectly accept (and have since at least GCC 4.1):

  extern "C++" namespace ns {
    struct Incomplete;
    Incomplete bar;
  }

for similar reasons: the contents of the namespace are still considered be an "unbraced" context of the extern "C++" and so bar is implicitly considered to be declared extern.  See also [dcl.link] p8.
Comment 1 GCC Commits 2024-05-02 13:53:15 UTC
The master branch has been updated by Nathaniel Shead <nshead@gcc.gnu.org>:

https://gcc.gnu.org/g:7317d62a1200dbd3685015e5d6b811497a27fe5f

commit r15-114-g7317d62a1200dbd3685015e5d6b811497a27fe5f
Author: Nathaniel Shead <nathanieloshead@gmail.com>
Date:   Thu May 2 12:55:24 2024 +1000

    c++: Clear is_unbraced_* when parsing declaration_seq_opt [PR114917]
    
    Currently we incorrectly retain "in_unbraced_linkage_specification_p"
    and "in_unbraced_export_declaration_p" when parsing a (braced)
    declaration-seq.  This patch ensures that we clear these flags before
    parsing the toplevel declarations.
    
    Strictly speaking we don't need to save and restore the flags around the
    parsing because there's currently no way to provide new declarations
    within the unbraced context after the closing brace, but this patch does
    it anyway in case this ever changes and for consistency with other
    places that these flags are adjusted.
    
            PR c++/114917
    
    gcc/cp/ChangeLog:
    
            * parser.cc (cp_parser_declaration_seq_opt): Clear
            parser->in_unbraced_* flags when parsing toplevel declarations.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/modules/export-5_a.C: New test.
            * g++.dg/modules/export-5_b.C: New test.
            * g++.dg/parse/linkage4.C: New test.
    
    Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Comment 2 Nathaniel Shead 2024-05-02 13:53:46 UTC
Fixed for GCC 15.