|
|
@ -320,7 +320,7 @@ constexpr void Parser::checkSpecifierCharType(const Specifier& specifier) |
|
|
|
{ |
|
|
|
{ |
|
|
|
checkSpecifierIntegralType(specifier); |
|
|
|
checkSpecifierIntegralType(specifier); |
|
|
|
|
|
|
|
|
|
|
|
// Valid: fill, align, width
|
|
|
|
// Valid: fill + align, width
|
|
|
|
// Invalid: sign, alternativeForm, zeroPadding, precision
|
|
|
|
// Invalid: sign, alternativeForm, zeroPadding, precision
|
|
|
|
if (specifier.type == PresentationType::None |
|
|
|
if (specifier.type == PresentationType::None |
|
|
|
|| specifier.type == PresentationType::Character) { |
|
|
|
|| specifier.type == PresentationType::Character) { |
|
|
@ -342,7 +342,7 @@ constexpr void Parser::checkSpecifierCStringType(const Specifier& specifier) |
|
|
|
VERIFY(false, "invalid type specifier"); |
|
|
|
VERIFY(false, "invalid type specifier"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Valid: fill, align, width
|
|
|
|
// Valid: fill + align, width
|
|
|
|
// Invalid: sign, alternativeForm, zeroPadding, precision
|
|
|
|
// Invalid: sign, alternativeForm, zeroPadding, precision
|
|
|
|
VERIFY(specifier.sign == Builder::Sign::None, "invalid specifier option"); |
|
|
|
VERIFY(specifier.sign == Builder::Sign::None, "invalid specifier option"); |
|
|
|
VERIFY(specifier.alternativeForm == false, "invalid specifier option"); |
|
|
|
VERIFY(specifier.alternativeForm == false, "invalid specifier option"); |
|
|
@ -362,6 +362,23 @@ constexpr void Parser::checkSpecifierPointerType(const Specifier& specifier) |
|
|
|
VERIFY(specifier.type != PresentationType::String, "invalid type specifier"); |
|
|
|
VERIFY(specifier.type != PresentationType::String, "invalid type specifier"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constexpr void Parser::checkSpecifierContainerType(const Specifier& specifier) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
switch (specifier.type) { |
|
|
|
|
|
|
|
case PresentationType::None: |
|
|
|
|
|
|
|
case PresentationType::Container: |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
VERIFY(false, "invalid type specifier"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Valid: fill + align, alternativeForm, width
|
|
|
|
|
|
|
|
// Invalid: sign, zeroPadding, precision
|
|
|
|
|
|
|
|
VERIFY(specifier.sign == Builder::Sign::None, "invalid specifier option"); |
|
|
|
|
|
|
|
VERIFY(specifier.zeroPadding == false, "invalid specifier option"); |
|
|
|
|
|
|
|
VERIFY(specifier.precision == -1, "invalid specifier option"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
constexpr void Parser::checkSpecifierType(const Specifier& specifier, ParameterType type) |
|
|
|
constexpr void Parser::checkSpecifierType(const Specifier& specifier, ParameterType type) |
|
|
|
{ |
|
|
|
{ |
|
|
|
switch (type) { |
|
|
|
switch (type) { |
|
|
@ -384,6 +401,7 @@ constexpr void Parser::checkSpecifierType(const Specifier& specifier, ParameterT |
|
|
|
checkSpecifierPointerType(specifier); |
|
|
|
checkSpecifierPointerType(specifier); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case ParameterType::Container: |
|
|
|
case ParameterType::Container: |
|
|
|
|
|
|
|
checkSpecifierContainerType(specifier); |
|
|
|
break; |
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
VERIFY_NOT_REACHED(); |
|
|
|
VERIFY_NOT_REACHED(); |
|
|
|