Init
This commit is contained in:
212
cppdraft/module/import.md
Normal file
212
cppdraft/module/import.md
Normal file
@@ -0,0 +1,212 @@
|
||||
[module.import]
|
||||
|
||||
# 10 Modules [[module]](./#module)
|
||||
|
||||
## 10.3 Import declaration [module.import]
|
||||
|
||||
[module-import-declaration:](#nt:module-import-declaration "10.3 Import declaration [module.import]")
|
||||
import-keyword [*module-name*](module.unit#nt:module-name "10.1 Module units and purviews [module.unit]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt ;
|
||||
import-keyword [*module-partition*](module.unit#nt:module-partition "10.1 Module units and purviews [module.unit]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt ;
|
||||
import-keyword [*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt ;
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L412)
|
||||
|
||||
A [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]") shall inhabit the global namespace scope[.](#1.sentence-1)
|
||||
|
||||
In a module unit, all [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]")*s* and [*export-declaration*](module.interface#nt:export-declaration "10.2 Export declaration [module.interface]")*s* exporting[*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]")*s* shall appear before all other [*declaration*](dcl.pre#nt:declaration "9.1 Preamble [dcl.pre]")*s* in
|
||||
the [*declaration-seq*](dcl.pre#nt:declaration-seq "9.1 Preamble [dcl.pre]") of the[*translation-unit*](basic.link#nt:translation-unit "6.7 Program and linkage [basic.link]") and of the [*private-module-fragment*](module.private.frag#nt:private-module-fragment "10.5 Private module fragment [module.private.frag]") (if any)[.](#1.sentence-2)
|
||||
|
||||
The optional [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]") appertains to the [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]")[.](#1.sentence-3)
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L425)
|
||||
|
||||
A [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]") [*imports*](#def:import "10.3 Import declaration [module.import]") a set of
|
||||
translation units determined as described below[.](#2.sentence-1)
|
||||
|
||||
[*Note [1](#note-1)*:
|
||||
|
||||
Namespace-scope declarations exported by the imported translation units
|
||||
can be found by name lookup ([[basic.lookup]](basic.lookup "6.5 Name lookup"))
|
||||
in the importing translation unit
|
||||
and declarations within the imported translation units
|
||||
become reachable ([[module.reach]](module.reach "10.7 Reachability"))
|
||||
in the importing translation unit
|
||||
after the import declaration[.](#2.sentence-2)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L438)
|
||||
|
||||
A [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]") that specifies
|
||||
a [*module-name*](module.unit#nt:module-name "10.1 Module units and purviews [module.unit]") M imports all module interface units of M[.](#3.sentence-1)
|
||||
|
||||
[4](#4)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L443)
|
||||
|
||||
A [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]") that specifies
|
||||
a [*module-partition*](module.unit#nt:module-partition "10.1 Module units and purviews [module.unit]") shall only appear after
|
||||
the [*module-declaration*](module.unit#nt:module-declaration "10.1 Module units and purviews [module.unit]") in a module unit of
|
||||
some module M[.](#4.sentence-1)
|
||||
|
||||
Such a declaration imports the so-named
|
||||
module partition of M[.](#4.sentence-2)
|
||||
|
||||
[5](#5)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L451)
|
||||
|
||||
A [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]") that specifies
|
||||
a [*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]") H imports
|
||||
a synthesized [*header unit*](#def:header_unit "10.3 Import declaration [module.import]"),
|
||||
which is a translation unit formed by applying
|
||||
phases 1 to 7 of translation ([[lex.phases]](lex.phases "5.2 Phases of translation"))
|
||||
to the source file or header nominated by H,
|
||||
which shall not contain a [*module-declaration*](module.unit#nt:module-declaration "10.1 Module units and purviews [module.unit]")[.](#5.sentence-1)
|
||||
|
||||
[*Note [2](#note-2)*:
|
||||
|
||||
A header unit is a separate translation unit with
|
||||
an independent set of defined macros[.](#5.sentence-2)
|
||||
|
||||
All declarations within a header unit are implicitly
|
||||
exported ([[module.interface]](module.interface "10.2 Export declaration")),
|
||||
and are attached to the global module ([[module.unit]](module.unit "10.1 Module units and purviews"))[.](#5.sentence-3)
|
||||
|
||||
â *end note*]
|
||||
|
||||
An [*importable header*](#def:header,importable "10.3 Import declaration [module.import]") is a member of animplementation-defined
|
||||
set of headers that
|
||||
includes all importable C++ library headers ([[headers]](headers "16.4.2.3 Headers"))[.](#5.sentence-4)
|
||||
|
||||
H shall identify an importable header[.](#5.sentence-5)
|
||||
|
||||
Given two such [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]")*s*:
|
||||
|
||||
- [(5.1)](#5.1)
|
||||
|
||||
if their [*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]")*s* identify
|
||||
different headers or source files ([[cpp.include]](cpp.include "15.3 Source file inclusion")),
|
||||
they import distinct header units;
|
||||
|
||||
- [(5.2)](#5.2)
|
||||
|
||||
otherwise, if they appear in the same translation unit,
|
||||
they import the same header unit;
|
||||
|
||||
- [(5.3)](#5.3)
|
||||
|
||||
otherwise, it is unspecified whether they import the same header unit[.](#5.sentence-6)
|
||||
[*Note [3](#note-3)*:
|
||||
It is therefore possible that multiple copies exist of entities
|
||||
declared with internal linkage in an importable header[.](#5.3.sentence-2)
|
||||
â *end note*]
|
||||
|
||||
[*Note [4](#note-4)*:
|
||||
|
||||
A [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]") nominating
|
||||
a [*header-name*](lex.header#nt:header-name "5.6 Header names [lex.header]") is also recognized by the
|
||||
preprocessor, and results in macros defined at the
|
||||
end of phase 4 of translation of the header unit
|
||||
being made visible as described in [[cpp.import]](cpp.import "15.6 Header unit importation")[.](#5.sentence-7)
|
||||
|
||||
Any other [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]") does not make macros visible[.](#5.sentence-8)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[6](#6)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L497)
|
||||
|
||||
A declaration of a name with internal linkage is
|
||||
permitted within a header unit despite all
|
||||
declarations being implicitly exported ([[module.interface]](module.interface "10.2 Export declaration"))[.](#6.sentence-1)
|
||||
|
||||
[*Note [5](#note-5)*:
|
||||
|
||||
A definition that appears in multiple translation units
|
||||
cannot in general refer to such names ([[basic.def.odr]](basic.def.odr "6.3 One-definition rule"))[.](#6.sentence-2)
|
||||
|
||||
â *end note*]
|
||||
|
||||
A header unit shall not contain
|
||||
a definition of a non-inline function or variable
|
||||
whose name has external linkage[.](#6.sentence-3)
|
||||
|
||||
[7](#7)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L509)
|
||||
|
||||
When a [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]") imports
|
||||
a translation unit T, it also imports
|
||||
all translation units imported by
|
||||
exported [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]")*s* in T; such translation units are
|
||||
said to be [*exported*](#def:module,exported "10.3 Import declaration [module.import]") by T[.](#7.sentence-1)
|
||||
|
||||
Additionally, when a [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]") in a module unit of some module M imports another module unit U of M,
|
||||
it also imports all translation units imported by
|
||||
non-exported [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]")*s* in the module unit purview of U[.](#7.sentence-2)[85](#footnote-85 "This is consistent with the lookup rules for imported names ([basic.lookup]).")
|
||||
|
||||
These rules can in turn lead to the importation of yet more
|
||||
translation units[.](#7.sentence-3)
|
||||
|
||||
[*Note [6](#note-6)*:
|
||||
|
||||
Such indirect importation does not make macros available,
|
||||
because a translation unit is
|
||||
a sequence of tokens in translation phase 7 ([[lex.phases]](lex.phases "5.2 Phases of translation"))[.](#7.sentence-4)
|
||||
|
||||
Macros can be made available by directly importing header units
|
||||
as described in [[cpp.import]](cpp.import "15.6 Header unit importation")[.](#7.sentence-5)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[8](#8)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L535)
|
||||
|
||||
A module implementation unit shall not be exported[.](#8.sentence-1)
|
||||
|
||||
[*Example [1](#example-1)*:
|
||||
|
||||
Translation unit #1:module M:Part;
|
||||
|
||||
Translation unit #2:export module M;export import :Part; // error: exported partition :Part is an implementation unit â *end example*]
|
||||
|
||||
[9](#9)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L548)
|
||||
|
||||
A module implementation unit of a module M that is not a module partition
|
||||
shall not contain a [*module-import-declaration*](#nt:module-import-declaration "10.3 Import declaration [module.import]") nominating M[.](#9.sentence-1)
|
||||
|
||||
[*Example [2](#example-2)*: module M;import M; // error: cannot import M in its own unit â *end example*]
|
||||
|
||||
[10](#10)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/modules.tex#L560)
|
||||
|
||||
A translation unit has an [*interface dependency*](#def:interface_dependency "10.3 Import declaration [module.import]") on a translation unit U if it contains a declaration (possibly a [*module-declaration*](module.unit#nt:module-declaration "10.1 Module units and purviews [module.unit]"))
|
||||
that imports U or if it has
|
||||
an interface dependency on a translation unit that has an interface dependency on U[.](#10.sentence-1)
|
||||
|
||||
A translation unit shall not have an interface dependency on itself[.](#10.sentence-2)
|
||||
|
||||
[*Example [3](#example-3)*:
|
||||
|
||||
Interface unit of M1:export module M1;import M2;
|
||||
|
||||
Interface unit of M2:export module M2;import M3;
|
||||
|
||||
Interface unit of M3:export module M3;import M1; // error: cyclic interface dependency M3 âM1 âM2 âM3 â *end example*]
|
||||
|
||||
[85)](#footnote-85)[85)](#footnoteref-85)
|
||||
|
||||
This is consistent
|
||||
with the lookup rules for imported names ([[basic.lookup]](basic.lookup "6.5 Name lookup"))[.](#footnote-85.sentence-1)
|
||||
Reference in New Issue
Block a user