This commit is contained in:
2025-10-25 03:02:53 +03:00
commit 043225d523
3416 changed files with 681196 additions and 0 deletions

60
cppdraft/stmt/label.md Normal file
View File

@@ -0,0 +1,60 @@
[stmt.label]
# 8 Statements [[stmt]](./#stmt)
## 8.2 Label [stmt.label]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L163)
A label can be added to a statement or
used anywhere in a [*compound-statement*](stmt.block#nt:compound-statement "8.4Compound statement or block[stmt.block]")[.](#1.sentence-1)
[label:](#nt:label "8.2Label[stmt.label]")
[*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]") :
[*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt case [*constant-expression*](expr.const#nt:constant-expression "7.7Constant expressions[expr.const]") :
[*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt default :
[labeled-statement:](#nt:labeled-statement "8.2Label[stmt.label]")
[*label*](#nt:label "8.2Label[stmt.label]") [*statement*](stmt.pre#nt:statement "8.1Preamble[stmt.pre]")
The optional [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]") appertains to the label[.](#1.sentence-2)
The only use of a label with an [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]") is
as the target of a goto[.](#1.sentence-3)
No two labels in a function shall have the same [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")[.](#1.sentence-4)
A label can be used in a goto statement
before its introduction[.](#1.sentence-5)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L190)
A [*labeled-statement*](#nt:labeled-statement "8.2Label[stmt.label]") whose [*label*](#nt:label "8.2Label[stmt.label]") is a case or default label
shall be enclosed by ([[stmt.pre]](stmt.pre "8.1Preamble")) a switch statement ([[stmt.switch]](stmt.switch "8.5.3The switch statement"))[.](#2.sentence-1)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L198)
A [*control-flow-limited statement*](#def:statement,control-flow-limited "8.2Label[stmt.label]") is a statement S for which:
- [(3.1)](#3.1)
a case or default label appearing within S shall
be associated with a switch statement ([[stmt.switch]](stmt.switch "8.5.3The switch statement")) within S, and
- [(3.2)](#3.2)
a label declared in S shall only be referred to by a
statement ([[stmt.goto]](stmt.goto "8.8.6The goto statement")) in S[.](#3.sentence-1)
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L210)
An identifier label shall not be enclosed
by an [*expansion-statement*](stmt.expand#nt:expansion-statement "8.7Expansion statements[stmt.expand]") ([[stmt.expand]](stmt.expand "8.7Expansion statements"))[.](#4.sentence-1)