Skip to content

Commit 8738b80

Browse files
committed
Parse: explicitly state ordering of parsing (NFC)
When the parameters are inlined, with optimizations, the evaluation order is under specified (with MSVC, the arguments are evaluated right to left rather than left to right). This results in the arguments being processed incorrectly. Create local variables to enforce the ordering of the processed tokens. Fixes the build on Windows with optimizations.
1 parent ed721c6 commit 8738b80

File tree

1 file changed

+36
-18
lines changed

1 file changed

+36
-18
lines changed

lib/Parse/ParseType.cpp

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,13 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID,
219219
if (!SyntaxContext->isEnabled())
220220
return;
221221
MetatypeTypeSyntaxBuilder Builder(Context.getSyntaxArena());
222+
auto TypeOrProtocol = SyntaxContext->popToken();
223+
auto Period = SyntaxContext->popToken();
224+
auto BaseType = SyntaxContext->popIf<TypeSyntax>().getValue();
222225
Builder
223-
.useTypeOrProtocol(SyntaxContext->popToken())
224-
.usePeriod(SyntaxContext->popToken())
225-
.useBaseType(SyntaxContext->popIf<TypeSyntax>().getValue());
226+
.useTypeOrProtocol(TypeOrProtocol)
227+
.usePeriod(Period)
228+
.useBaseType(BaseType);
226229
SyntaxContext->addSyntax(Builder.build());
227230
};
228231

@@ -433,10 +436,13 @@ ParserResult<TypeRepr> Parser::parseType(Diag<> MessageID,
433436
auto InputNode = SyntaxContext->popIf<TypeSyntax>().getValue();
434437
if (auto TupleTypeNode = InputNode.getAs<TupleTypeSyntax>()) {
435438
// Decompose TupleTypeSyntax and repack into FunctionType.
439+
auto LeftParen = TupleTypeNode->getLeftParen();
440+
auto Arguments = TupleTypeNode->getElements();
441+
auto RightParen = TupleTypeNode->getRightParen();
436442
Builder
437-
.useLeftParen(TupleTypeNode->getLeftParen())
438-
.useArguments(TupleTypeNode->getElements())
439-
.useRightParen(TupleTypeNode->getRightParen());
443+
.useLeftParen(LeftParen)
444+
.useArguments(Arguments)
445+
.useRightParen(RightParen);
440446
} else {
441447
Builder.addTupleTypeElement(SyntaxFactory::makeTupleTypeElement(
442448
InputNode, /*TrailingComma=*/None, Context.getSyntaxArena()));
@@ -705,9 +711,11 @@ Parser::parseTypeSimpleOrComposition(Diag<> MessageID,
705711

706712
if (SyntaxContext->isEnabled() && Status.isSuccess()) {
707713
CompositionTypeElementSyntaxBuilder Builder(Context.getSyntaxArena());
714+
auto Ampersand = SyntaxContext->popToken();
715+
auto Type = SyntaxContext->popIf<TypeSyntax>().getValue();
708716
Builder
709-
.useAmpersand(SyntaxContext->popToken())
710-
.useType(SyntaxContext->popIf<TypeSyntax>().getValue());
717+
.useAmpersand(Ampersand)
718+
.useType(Type);
711719
SyntaxContext->addSyntax(Builder.build());
712720
}
713721

@@ -1114,23 +1122,31 @@ SyntaxParserResult<TypeSyntax, TypeRepr> Parser::parseTypeCollection() {
11141122
DictionaryTypeRepr(firstTy.get(), secondTy.get(), colonLoc, brackets);
11151123
if (SyntaxContext->isEnabled()) {
11161124
DictionaryTypeSyntaxBuilder Builder(Context.getSyntaxArena());
1125+
auto RightSquareBracket = SyntaxContext->popToken();
1126+
auto ValueType = SyntaxContext->popIf<TypeSyntax>().getValue();
1127+
auto Colon = SyntaxContext->popToken();
1128+
auto KeyType = SyntaxContext->popIf<TypeSyntax>().getValue();
1129+
auto LeftSquareBracket = SyntaxContext->popToken();
11171130
Builder
1118-
.useRightSquareBracket(SyntaxContext->popToken())
1119-
.useValueType(SyntaxContext->popIf<TypeSyntax>().getValue())
1120-
.useColon(SyntaxContext->popToken())
1121-
.useKeyType(SyntaxContext->popIf<TypeSyntax>().getValue())
1122-
.useLeftSquareBracket(SyntaxContext->popToken());
1131+
.useRightSquareBracket(RightSquareBracket)
1132+
.useValueType(ValueType)
1133+
.useColon(Colon)
1134+
.useKeyType(KeyType)
1135+
.useLeftSquareBracket(LeftSquareBracket);
11231136
SyntaxNode.emplace(Builder.build());
11241137
}
11251138
} else {
11261139
// Form the array type.
11271140
TyR = new (Context) ArrayTypeRepr(firstTy.get(), brackets);
11281141
if (SyntaxContext->isEnabled()) {
11291142
ArrayTypeSyntaxBuilder Builder(Context.getSyntaxArena());
1143+
auto RightSquareBracket = SyntaxContext->popToken();
1144+
auto ElementType = SyntaxContext->popIf<TypeSyntax>().getValue();
1145+
auto LeftSquareBracket = SyntaxContext->popToken();
11301146
Builder
1131-
.useRightSquareBracket(SyntaxContext->popToken())
1132-
.useElementType(SyntaxContext->popIf<TypeSyntax>().getValue())
1133-
.useLeftSquareBracket(SyntaxContext->popToken());
1147+
.useRightSquareBracket(RightSquareBracket)
1148+
.useElementType(ElementType)
1149+
.useLeftSquareBracket(LeftSquareBracket);
11341150
SyntaxNode.emplace(Builder.build());
11351151
}
11361152
}
@@ -1212,9 +1228,11 @@ Parser::parseTypeImplicitlyUnwrappedOptional(TypeRepr *base) {
12121228
if (SyntaxContext->isEnabled()) {
12131229
ImplicitlyUnwrappedOptionalTypeSyntaxBuilder Builder(
12141230
Context.getSyntaxArena());
1231+
auto ExclamationMark = SyntaxContext->popToken();
1232+
auto WrappedType = SyntaxContext->popIf<TypeSyntax>().getValue();
12151233
Builder
1216-
.useExclamationMark(SyntaxContext->popToken())
1217-
.useWrappedType(SyntaxContext->popIf<TypeSyntax>().getValue());
1234+
.useExclamationMark(ExclamationMark)
1235+
.useWrappedType(WrappedType);
12181236
SyntaxNode.emplace(Builder.build());
12191237
}
12201238
return makeSyntaxResult(SyntaxNode, TyR);

0 commit comments

Comments
 (0)