Don't define an unscoped enumeration out of line. (#5282)

The C++ language semantics for doing so are weird and a bit broken.
Under
[CWG1485](https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1485)
this code may become invalid in the future.
This commit is contained in:
Richard Smith
2025-04-09 22:41:31 +00:00
committed by GitHub
parent a527626d87
commit 6322c7734e
+37 -38
View File
@@ -88,7 +88,43 @@ class PrecedenceGroup {
}
private:
enum PrecedenceLevel : int8_t;
enum PrecedenceLevel : int8_t {
// Sentinel representing the absence of any operator.
Highest,
// Terms.
TermPrefix,
// Numeric.
IncrementDecrement,
NumericPrefix,
Modulo,
Multiplicative,
Additive,
// Bitwise.
BitwisePrefix,
BitwiseAnd,
BitwiseOr,
BitwiseXor,
BitShift,
// Type formation.
TypePrefix,
TypePostfix,
// `where` keyword.
Where,
// Casts.
As,
// Logical.
LogicalPrefix,
Relational,
LogicalAnd,
LogicalOr,
// Conditional.
If,
// Assignment.
Assignment,
// Sentinel representing a context in which any operator can appear.
Lowest,
};
struct OperatorPriorityTable;
static const int8_t NumPrecedenceLevels;
@@ -117,43 +153,6 @@ struct PrecedenceGroup::Trailing {
//
////////////////////////////////////////////////////////////////////////////////
enum PrecedenceGroup::PrecedenceLevel : int8_t {
// Sentinel representing the absence of any operator.
Highest,
// Terms.
TermPrefix,
// Numeric.
IncrementDecrement,
NumericPrefix,
Modulo,
Multiplicative,
Additive,
// Bitwise.
BitwisePrefix,
BitwiseAnd,
BitwiseOr,
BitwiseXor,
BitShift,
// Type formation.
TypePrefix,
TypePostfix,
// `where` keyword.
Where,
// Casts.
As,
// Logical.
LogicalPrefix,
Relational,
LogicalAnd,
LogicalOr,
// Conditional.
If,
// Assignment.
Assignment,
// Sentinel representing a context in which any operator can appear.
Lowest,
};
inline auto PrecedenceGroup::ForPostfixExpr() -> PrecedenceGroup {
return PrecedenceGroup(Highest);
}