1 //===- llvm/unittest/FileCheck/FileCheckTest.cpp - FileCheck tests --------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/FileCheck/FileCheck.h"
10 #include "../lib/FileCheck/FileCheckImpl.h"
11 #include "llvm/Support/Regex.h"
12 #include "llvm/Testing/Support/Error.h"
13 #include "gtest/gtest.h"
14 #include <tuple>
15 #include <unordered_set>
16 
17 using namespace llvm;
18 
19 namespace {
20 
21 class FileCheckTest : public ::testing::Test {};
22 
23 static StringRef bufferize(SourceMgr &SM, StringRef Str) {
24   std::unique_ptr<MemoryBuffer> Buffer =
25       MemoryBuffer::getMemBufferCopy(Str, "TestBuffer");
26   StringRef StrBufferRef = Buffer->getBuffer();
27   SM.AddNewSourceBuffer(std::move(Buffer), SMLoc());
28   return StrBufferRef;
29 }
30 
31 static std::string toString(const std::unordered_set<std::string> &Set) {
32   bool First = true;
33   std::string Str;
34   for (StringRef S : Set) {
35     Str += Twine(First ? "{" + S : ", " + S).str();
36     First = false;
37   }
38   Str += '}';
39   return Str;
40 }
41 
42 template <typename ErrorT>
43 static void expectSameErrors(std::unordered_set<std::string> ExpectedMsgs,
44                              Error Err) {
45   auto AnyErrorMsgMatch = [&ExpectedMsgs](std::string &&ErrorMsg) -> bool {
46     for (auto ExpectedMsgItr = ExpectedMsgs.begin(),
47               ExpectedMsgEnd = ExpectedMsgs.end();
48          ExpectedMsgItr != ExpectedMsgEnd; ++ExpectedMsgItr) {
49       if (ErrorMsg.find(*ExpectedMsgItr) != std::string::npos) {
50         ExpectedMsgs.erase(ExpectedMsgItr);
51         return true;
52       }
53     }
54     return false;
55   };
56 
57   Error RemainingErrors = std::move(Err);
58   do {
59     RemainingErrors =
60         handleErrors(std::move(RemainingErrors), [&](const ErrorT &E) {
61           EXPECT_TRUE(AnyErrorMsgMatch(E.message()))
62               << "Unexpected error message:" << std::endl
63               << E.message();
64         });
65   } while (RemainingErrors && !ExpectedMsgs.empty());
66   EXPECT_THAT_ERROR(std::move(RemainingErrors), Succeeded());
67   EXPECT_TRUE(ExpectedMsgs.empty())
68       << "Error message(s) not found:" << std::endl
69       << toString(ExpectedMsgs);
70 }
71 
72 template <typename ErrorT>
73 static void expectError(StringRef ExpectedMsg, Error Err) {
74   expectSameErrors<ErrorT>({ExpectedMsg.str()}, std::move(Err));
75 }
76 
77 static void expectDiagnosticError(StringRef ExpectedMsg, Error Err) {
78   expectError<ErrorDiagnostic>(ExpectedMsg, std::move(Err));
79 }
80 
81 constexpr uint64_t MaxUint64 = std::numeric_limits<uint64_t>::max();
82 constexpr int64_t MaxInt64 = std::numeric_limits<int64_t>::max();
83 constexpr int64_t MinInt64 = std::numeric_limits<int64_t>::min();
84 constexpr uint64_t AbsoluteMinInt64 =
85     static_cast<uint64_t>(-(MinInt64 + 1)) + 1;
86 constexpr uint64_t AbsoluteMaxInt64 = static_cast<uint64_t>(MaxInt64);
87 
88 struct ExpressionFormatParameterisedFixture
89     : public ::testing::TestWithParam<
90           std::pair<ExpressionFormat::Kind, unsigned>> {
91   unsigned Precision;
92   bool Signed;
93   bool AllowHex;
94   bool AllowUpperHex;
95   ExpressionFormat Format;
96   Regex WildcardRegex;
97 
98   StringRef TenStr;
99   StringRef FifteenStr;
100   std::string MaxUint64Str;
101   std::string MaxInt64Str;
102   std::string MinInt64Str;
103   StringRef FirstInvalidCharDigits;
104   StringRef AcceptedHexOnlyDigits;
105   StringRef RefusedHexOnlyDigits;
106 
107   SourceMgr SM;
108 
109   void SetUp() override {
110     ExpressionFormat::Kind Kind;
111     std::tie(Kind, Precision) = GetParam();
112     AllowHex = Kind == ExpressionFormat::Kind::HexLower ||
113                Kind == ExpressionFormat::Kind::HexUpper;
114     AllowUpperHex = Kind == ExpressionFormat::Kind::HexUpper;
115     Signed = Kind == ExpressionFormat::Kind::Signed;
116     Format = ExpressionFormat(Kind, Precision);
117 
118     if (!AllowHex) {
119       MaxUint64Str = std::to_string(MaxUint64);
120       MaxInt64Str = std::to_string(MaxInt64);
121       MinInt64Str = std::to_string(MinInt64);
122       TenStr = "10";
123       FifteenStr = "15";
124       FirstInvalidCharDigits = "aA";
125       AcceptedHexOnlyDigits = RefusedHexOnlyDigits = "N/A";
126       return;
127     }
128 
129     MaxUint64Str = AllowUpperHex ? "FFFFFFFFFFFFFFFF" : "ffffffffffffffff";
130     MaxInt64Str = AllowUpperHex ? "7FFFFFFFFFFFFFFF" : "7fffffffffffffff";
131     TenStr = AllowUpperHex ? "A" : "a";
132     FifteenStr = AllowUpperHex ? "F" : "f";
133     AcceptedHexOnlyDigits = AllowUpperHex ? "ABCDEF" : "abcdef";
134     RefusedHexOnlyDigits = AllowUpperHex ? "abcdef" : "ABCDEF";
135     MinInt64Str = "N/A";
136     FirstInvalidCharDigits = "gG";
137   }
138 
139   void checkWildcardRegexMatch(StringRef Input,
140                                unsigned TrailExtendTo = 0) const {
141     SmallVector<StringRef, 4> Matches;
142     std::string ExtendedInput = Input.str();
143     if (TrailExtendTo > Input.size()) {
144       ExtendedInput.append(TrailExtendTo - Input.size(), Input[0]);
145     }
146     ASSERT_TRUE(WildcardRegex.match(ExtendedInput, &Matches))
147         << "Wildcard regex does not match " << ExtendedInput;
148     EXPECT_EQ(Matches[0], ExtendedInput);
149   }
150 
151   void checkWildcardRegexMatchFailure(StringRef Input) const {
152     EXPECT_FALSE(WildcardRegex.match(Input));
153   }
154 
155   void checkWildcardRegexCharMatchFailure(StringRef Chars) const {
156     for (auto C : Chars)
157       EXPECT_FALSE(WildcardRegex.match(StringRef(&C, 1)));
158   }
159 
160   std::string padWithLeadingZeros(StringRef NumStr) const {
161     bool Negative = NumStr.startswith("-");
162     if (NumStr.size() - unsigned(Negative) >= Precision)
163       return NumStr.str();
164 
165     std::string PaddedStr;
166     if (Negative) {
167       PaddedStr = "-";
168       NumStr = NumStr.drop_front();
169     }
170     PaddedStr.append(Precision - NumStr.size(), '0');
171     PaddedStr.append(NumStr.str());
172     return PaddedStr;
173   }
174 
175   template <class T> void checkMatchingString(T Val, StringRef ExpectedStr) {
176     Expected<std::string> MatchingString =
177         Format.getMatchingString(ExpressionValue(Val));
178     ASSERT_THAT_EXPECTED(MatchingString, Succeeded())
179         << "No matching string for " << Val;
180     EXPECT_EQ(*MatchingString, ExpectedStr);
181   }
182 
183   template <class T> void checkMatchingStringFailure(T Val) {
184     Expected<std::string> MatchingString =
185         Format.getMatchingString(ExpressionValue(Val));
186     // Error message tested in ExpressionValue unit tests.
187     EXPECT_THAT_EXPECTED(MatchingString, Failed());
188   }
189 
190   Expected<ExpressionValue> getValueFromStringReprFailure(StringRef Str) {
191     StringRef BufferizedStr = bufferize(SM, Str);
192     return Format.valueFromStringRepr(BufferizedStr, SM);
193   }
194 
195   template <class T>
196   void checkValueFromStringRepr(StringRef Str, T ExpectedVal) {
197     Expected<ExpressionValue> ResultValue = getValueFromStringReprFailure(Str);
198     ASSERT_THAT_EXPECTED(ResultValue, Succeeded())
199         << "Failed to get value from " << Str;
200     ASSERT_EQ(ResultValue->isNegative(), ExpectedVal < 0)
201         << "Value for " << Str << " is not " << ExpectedVal;
202     if (ResultValue->isNegative())
203       EXPECT_EQ(cantFail(ResultValue->getSignedValue()),
204                 static_cast<int64_t>(ExpectedVal));
205     else
206       EXPECT_EQ(cantFail(ResultValue->getUnsignedValue()),
207                 static_cast<uint64_t>(ExpectedVal));
208   }
209 
210   void checkValueFromStringReprFailure(StringRef Str) {
211     StringRef OverflowErrorStr = "unable to represent numeric value";
212     Expected<ExpressionValue> ResultValue = getValueFromStringReprFailure(Str);
213     expectDiagnosticError(OverflowErrorStr, ResultValue.takeError());
214   }
215 };
216 
217 TEST_P(ExpressionFormatParameterisedFixture, FormatGetWildcardRegex) {
218   // Wildcard regex is valid.
219   Expected<std::string> WildcardPattern = Format.getWildcardRegex();
220   ASSERT_THAT_EXPECTED(WildcardPattern, Succeeded());
221   WildcardRegex = Regex((Twine("^") + *WildcardPattern + "$").str());
222   ASSERT_TRUE(WildcardRegex.isValid());
223 
224   // Does not match empty string.
225   checkWildcardRegexMatchFailure("");
226 
227   // Matches all decimal digits and matches several of them.
228   StringRef LongNumber = "12345678901234567890";
229   checkWildcardRegexMatch(LongNumber);
230 
231   // Matches negative digits.
232   LongNumber = "-12345678901234567890";
233   if (Signed)
234     checkWildcardRegexMatch(LongNumber);
235   else
236     checkWildcardRegexMatchFailure(LongNumber);
237 
238   // Check non digits or digits with wrong casing are not matched.
239   if (AllowHex) {
240     checkWildcardRegexMatch(AcceptedHexOnlyDigits, 16);
241     checkWildcardRegexCharMatchFailure(RefusedHexOnlyDigits);
242   }
243   checkWildcardRegexCharMatchFailure(FirstInvalidCharDigits);
244 
245   // Check leading zeros are only accepted if number of digits is less than the
246   // precision.
247   LongNumber = "01234567890123456789";
248   if (Precision) {
249     checkWildcardRegexMatch(LongNumber.take_front(Precision));
250     checkWildcardRegexMatchFailure(LongNumber.take_front(Precision - 1));
251     if (Precision < LongNumber.size())
252       checkWildcardRegexMatchFailure(LongNumber.take_front(Precision + 1));
253   } else
254     checkWildcardRegexMatch(LongNumber);
255 }
256 
257 TEST_P(ExpressionFormatParameterisedFixture, FormatGetMatchingString) {
258   checkMatchingString(0, padWithLeadingZeros("0"));
259   checkMatchingString(9, padWithLeadingZeros("9"));
260 
261   if (Signed) {
262     checkMatchingString(-5, padWithLeadingZeros("-5"));
263     checkMatchingStringFailure(MaxUint64);
264     checkMatchingString(MaxInt64, padWithLeadingZeros(MaxInt64Str));
265     checkMatchingString(MinInt64, padWithLeadingZeros(MinInt64Str));
266   } else {
267     checkMatchingStringFailure(-5);
268     checkMatchingString(MaxUint64, padWithLeadingZeros(MaxUint64Str));
269     checkMatchingString(MaxInt64, padWithLeadingZeros(MaxInt64Str));
270     checkMatchingStringFailure(MinInt64);
271   }
272 
273   checkMatchingString(10, padWithLeadingZeros(TenStr));
274   checkMatchingString(15, padWithLeadingZeros(FifteenStr));
275 }
276 
277 TEST_P(ExpressionFormatParameterisedFixture, FormatValueFromStringRepr) {
278   checkValueFromStringRepr("0", 0);
279   checkValueFromStringRepr("9", 9);
280 
281   if (Signed) {
282     checkValueFromStringRepr("-5", -5);
283     checkValueFromStringReprFailure(MaxUint64Str);
284   } else {
285     checkValueFromStringReprFailure("-5");
286     checkValueFromStringRepr(MaxUint64Str, MaxUint64);
287   }
288 
289   checkValueFromStringRepr(TenStr, 10);
290   checkValueFromStringRepr(FifteenStr, 15);
291 
292   // Wrong casing is not tested because valueFromStringRepr() relies on
293   // StringRef's getAsInteger() which does not allow to restrict casing.
294   checkValueFromStringReprFailure("G");
295 }
296 
297 TEST_P(ExpressionFormatParameterisedFixture, FormatBoolOperator) {
298   EXPECT_TRUE(bool(Format));
299 }
300 
301 INSTANTIATE_TEST_CASE_P(
302     AllowedExplicitExpressionFormat, ExpressionFormatParameterisedFixture,
303     ::testing::Values(std::make_pair(ExpressionFormat::Kind::Unsigned, 0),
304                       std::make_pair(ExpressionFormat::Kind::Signed, 0),
305                       std::make_pair(ExpressionFormat::Kind::HexLower, 0),
306                       std::make_pair(ExpressionFormat::Kind::HexUpper, 0),
307 
308                       std::make_pair(ExpressionFormat::Kind::Unsigned, 1),
309                       std::make_pair(ExpressionFormat::Kind::Signed, 1),
310                       std::make_pair(ExpressionFormat::Kind::HexLower, 1),
311                       std::make_pair(ExpressionFormat::Kind::HexUpper, 1),
312 
313                       std::make_pair(ExpressionFormat::Kind::Unsigned, 16),
314                       std::make_pair(ExpressionFormat::Kind::Signed, 16),
315                       std::make_pair(ExpressionFormat::Kind::HexLower, 16),
316                       std::make_pair(ExpressionFormat::Kind::HexUpper, 16),
317 
318                       std::make_pair(ExpressionFormat::Kind::Unsigned, 20),
319                       std::make_pair(ExpressionFormat::Kind::Signed, 20)), );
320 
321 TEST_F(FileCheckTest, NoFormatProperties) {
322   ExpressionFormat NoFormat(ExpressionFormat::Kind::NoFormat);
323   expectError<StringError>("trying to match value with invalid format",
324                            NoFormat.getWildcardRegex().takeError());
325   expectError<StringError>(
326       "trying to match value with invalid format",
327       NoFormat.getMatchingString(ExpressionValue(18u)).takeError());
328   EXPECT_FALSE(bool(NoFormat));
329 }
330 
331 TEST_F(FileCheckTest, FormatEqualityOperators) {
332   ExpressionFormat UnsignedFormat(ExpressionFormat::Kind::Unsigned);
333   ExpressionFormat UnsignedFormat2(ExpressionFormat::Kind::Unsigned);
334   EXPECT_TRUE(UnsignedFormat == UnsignedFormat2);
335   EXPECT_FALSE(UnsignedFormat != UnsignedFormat2);
336 
337   ExpressionFormat HexLowerFormat(ExpressionFormat::Kind::HexLower);
338   EXPECT_FALSE(UnsignedFormat == HexLowerFormat);
339   EXPECT_TRUE(UnsignedFormat != HexLowerFormat);
340 
341   ExpressionFormat NoFormat(ExpressionFormat::Kind::NoFormat);
342   ExpressionFormat NoFormat2(ExpressionFormat::Kind::NoFormat);
343   EXPECT_FALSE(NoFormat == NoFormat2);
344   EXPECT_TRUE(NoFormat != NoFormat2);
345 }
346 
347 TEST_F(FileCheckTest, FormatKindEqualityOperators) {
348   ExpressionFormat UnsignedFormat(ExpressionFormat::Kind::Unsigned);
349   EXPECT_TRUE(UnsignedFormat == ExpressionFormat::Kind::Unsigned);
350   EXPECT_FALSE(UnsignedFormat != ExpressionFormat::Kind::Unsigned);
351   EXPECT_FALSE(UnsignedFormat == ExpressionFormat::Kind::HexLower);
352   EXPECT_TRUE(UnsignedFormat != ExpressionFormat::Kind::HexLower);
353   ExpressionFormat NoFormat(ExpressionFormat::Kind::NoFormat);
354   EXPECT_TRUE(NoFormat == ExpressionFormat::Kind::NoFormat);
355   EXPECT_FALSE(NoFormat != ExpressionFormat::Kind::NoFormat);
356 }
357 
358 template <class T1, class T2>
359 static Expected<ExpressionValue> doValueOperation(binop_eval_t Operation,
360                                                   T1 LeftValue, T2 RightValue) {
361   ExpressionValue LeftOperand(LeftValue);
362   ExpressionValue RightOperand(RightValue);
363   return Operation(LeftOperand, RightOperand);
364 }
365 
366 template <class T>
367 static void expectValueEqual(ExpressionValue ActualValue, T ExpectedValue) {
368   EXPECT_EQ(ExpectedValue < 0, ActualValue.isNegative());
369   if (ExpectedValue < 0) {
370     Expected<int64_t> SignedActualValue = ActualValue.getSignedValue();
371     ASSERT_THAT_EXPECTED(SignedActualValue, Succeeded());
372     EXPECT_EQ(*SignedActualValue, static_cast<int64_t>(ExpectedValue));
373   } else {
374     Expected<uint64_t> UnsignedActualValue = ActualValue.getUnsignedValue();
375     ASSERT_THAT_EXPECTED(UnsignedActualValue, Succeeded());
376     EXPECT_EQ(*UnsignedActualValue, static_cast<uint64_t>(ExpectedValue));
377   }
378 }
379 
380 template <class T1, class T2, class TR>
381 static void expectOperationValueResult(binop_eval_t Operation, T1 LeftValue,
382                                        T2 RightValue, TR ResultValue) {
383   Expected<ExpressionValue> OperationResult =
384       doValueOperation(Operation, LeftValue, RightValue);
385   ASSERT_THAT_EXPECTED(OperationResult, Succeeded());
386   expectValueEqual(*OperationResult, ResultValue);
387 }
388 
389 template <class T1, class T2>
390 static void expectOperationValueResult(binop_eval_t Operation, T1 LeftValue,
391                                        T2 RightValue) {
392   expectError<OverflowError>(
393       "overflow error",
394       doValueOperation(Operation, LeftValue, RightValue).takeError());
395 }
396 
397 TEST_F(FileCheckTest, ExpressionValueGetUnsigned) {
398   // Test positive value.
399   Expected<uint64_t> UnsignedValue = ExpressionValue(10).getUnsignedValue();
400   ASSERT_THAT_EXPECTED(UnsignedValue, Succeeded());
401   EXPECT_EQ(*UnsignedValue, 10U);
402 
403   // Test 0.
404   UnsignedValue = ExpressionValue(0).getUnsignedValue();
405   ASSERT_THAT_EXPECTED(UnsignedValue, Succeeded());
406   EXPECT_EQ(*UnsignedValue, 0U);
407 
408   // Test max positive value.
409   UnsignedValue = ExpressionValue(MaxUint64).getUnsignedValue();
410   ASSERT_THAT_EXPECTED(UnsignedValue, Succeeded());
411   EXPECT_EQ(*UnsignedValue, MaxUint64);
412 
413   // Test failure with negative value.
414   expectError<OverflowError>(
415       "overflow error", ExpressionValue(-1).getUnsignedValue().takeError());
416 
417   // Test failure with min negative value.
418   expectError<OverflowError>(
419       "overflow error",
420       ExpressionValue(MinInt64).getUnsignedValue().takeError());
421 }
422 
423 TEST_F(FileCheckTest, ExpressionValueGetSigned) {
424   // Test positive value.
425   Expected<int64_t> SignedValue = ExpressionValue(10).getSignedValue();
426   ASSERT_THAT_EXPECTED(SignedValue, Succeeded());
427   EXPECT_EQ(*SignedValue, 10);
428 
429   // Test 0.
430   SignedValue = ExpressionValue(0).getSignedValue();
431   ASSERT_THAT_EXPECTED(SignedValue, Succeeded());
432   EXPECT_EQ(*SignedValue, 0);
433 
434   // Test max int64_t.
435   SignedValue = ExpressionValue(MaxInt64).getSignedValue();
436   ASSERT_THAT_EXPECTED(SignedValue, Succeeded());
437   EXPECT_EQ(*SignedValue, MaxInt64);
438 
439   // Test failure with too big positive value.
440   expectError<OverflowError>(
441       "overflow error", ExpressionValue(static_cast<uint64_t>(MaxInt64) + 1)
442                             .getSignedValue()
443                             .takeError());
444 
445   // Test failure with max uint64_t.
446   expectError<OverflowError>(
447       "overflow error",
448       ExpressionValue(MaxUint64).getSignedValue().takeError());
449 
450   // Test negative value.
451   SignedValue = ExpressionValue(-10).getSignedValue();
452   ASSERT_THAT_EXPECTED(SignedValue, Succeeded());
453   EXPECT_EQ(*SignedValue, -10);
454 
455   // Test min int64_t.
456   SignedValue = ExpressionValue(MinInt64).getSignedValue();
457   ASSERT_THAT_EXPECTED(SignedValue, Succeeded());
458   EXPECT_EQ(*SignedValue, MinInt64);
459 }
460 
461 TEST_F(FileCheckTest, ExpressionValueAbsolute) {
462   // Test positive value.
463   expectValueEqual(ExpressionValue(10).getAbsolute(), 10);
464 
465   // Test 0.
466   expectValueEqual(ExpressionValue(0).getAbsolute(), 0);
467 
468   // Test max uint64_t.
469   expectValueEqual(ExpressionValue(MaxUint64).getAbsolute(), MaxUint64);
470 
471   // Test negative value.
472   expectValueEqual(ExpressionValue(-10).getAbsolute(), 10);
473 
474   // Test absence of overflow on min int64_t.
475   expectValueEqual(ExpressionValue(MinInt64).getAbsolute(),
476                    static_cast<uint64_t>(-(MinInt64 + 10)) + 10);
477 }
478 
479 TEST_F(FileCheckTest, ExpressionValueAddition) {
480   // Test both negative values.
481   expectOperationValueResult(operator+, -10, -10, -20);
482 
483   // Test both negative values with underflow.
484   expectOperationValueResult(operator+, MinInt64, -1);
485   expectOperationValueResult(operator+, MinInt64, MinInt64);
486 
487   // Test negative and positive value.
488   expectOperationValueResult(operator+, -10, 10, 0);
489   expectOperationValueResult(operator+, -10, 11, 1);
490   expectOperationValueResult(operator+, -11, 10, -1);
491 
492   // Test positive and negative value.
493   expectOperationValueResult(operator+, 10, -10, 0);
494   expectOperationValueResult(operator+, 10, -11, -1);
495   expectOperationValueResult(operator+, 11, -10, 1);
496 
497   // Test both positive values.
498   expectOperationValueResult(operator+, 10, 10, 20);
499 
500   // Test both positive values with overflow.
501   expectOperationValueResult(operator+, MaxUint64, 1);
502   expectOperationValueResult(operator+, MaxUint64, MaxUint64);
503 }
504 
505 TEST_F(FileCheckTest, ExpressionValueSubtraction) {
506   // Test negative value and value bigger than int64_t max.
507   expectOperationValueResult(operator-, -10, MaxUint64);
508 
509   // Test negative and positive value with underflow.
510   expectOperationValueResult(operator-, MinInt64, 1);
511 
512   // Test negative and positive value.
513   expectOperationValueResult(operator-, -10, 10, -20);
514 
515   // Test both negative values.
516   expectOperationValueResult(operator-, -10, -10, 0);
517   expectOperationValueResult(operator-, -11, -10, -1);
518   expectOperationValueResult(operator-, -10, -11, 1);
519 
520   // Test positive and negative values.
521   expectOperationValueResult(operator-, 10, -10, 20);
522 
523   // Test both positive values with result positive.
524   expectOperationValueResult(operator-, 10, 5, 5);
525 
526   // Test both positive values with underflow.
527   expectOperationValueResult(operator-, 0, MaxUint64);
528   expectOperationValueResult(operator-, 0,
529                              static_cast<uint64_t>(-(MinInt64 + 10)) + 11);
530 
531   // Test both positive values with result < -(max int64_t)
532   expectOperationValueResult(operator-, 10,
533                              static_cast<uint64_t>(MaxInt64) + 11,
534                              -MaxInt64 - 1);
535 
536   // Test both positive values with 0 > result > -(max int64_t)
537   expectOperationValueResult(operator-, 10, 11, -1);
538 }
539 
540 TEST_F(FileCheckTest, ExpressionValueMultiplication) {
541   // Test mixed signed values.
542   expectOperationValueResult(operator*, -3, 10, -30);
543   expectOperationValueResult(operator*, 2, -17, -34);
544   expectOperationValueResult(operator*, 0, MinInt64, 0);
545   expectOperationValueResult(operator*, MinInt64, 1, MinInt64);
546   expectOperationValueResult(operator*, 1, MinInt64, MinInt64);
547   expectOperationValueResult(operator*, MaxInt64, -1, -MaxInt64);
548   expectOperationValueResult(operator*, -1, MaxInt64, -MaxInt64);
549 
550   // Test both negative values.
551   expectOperationValueResult(operator*, -3, -10, 30);
552   expectOperationValueResult(operator*, -2, -17, 34);
553   expectOperationValueResult(operator*, MinInt64, -1, AbsoluteMinInt64);
554 
555   // Test both positive values.
556   expectOperationValueResult(operator*, 3, 10, 30);
557   expectOperationValueResult(operator*, 2, 17, 34);
558   expectOperationValueResult(operator*, 0, MaxUint64, 0);
559 
560   // Test negative results that underflow.
561   expectOperationValueResult(operator*, -10, MaxInt64);
562   expectOperationValueResult(operator*, MaxInt64, -10);
563   expectOperationValueResult(operator*, 10, MinInt64);
564   expectOperationValueResult(operator*, MinInt64, 10);
565   expectOperationValueResult(operator*, -1, MaxUint64);
566   expectOperationValueResult(operator*, MaxUint64, -1);
567   expectOperationValueResult(operator*, -1, AbsoluteMaxInt64 + 2);
568   expectOperationValueResult(operator*, AbsoluteMaxInt64 + 2, -1);
569 
570   // Test positive results that overflow.
571   expectOperationValueResult(operator*, 10, MaxUint64);
572   expectOperationValueResult(operator*, MaxUint64, 10);
573   expectOperationValueResult(operator*, MinInt64, -10);
574   expectOperationValueResult(operator*, -10, MinInt64);
575 }
576 
577 TEST_F(FileCheckTest, ExpressionValueDivision) {
578   // Test mixed signed values.
579   expectOperationValueResult(operator/, -30, 10, -3);
580   expectOperationValueResult(operator/, 34, -17, -2);
581   expectOperationValueResult(operator/, 0, -10, 0);
582   expectOperationValueResult(operator/, MinInt64, 1, MinInt64);
583   expectOperationValueResult(operator/, MaxInt64, -1, -MaxInt64);
584   expectOperationValueResult(operator/, -MaxInt64, 1, -MaxInt64);
585 
586   // Test both negative values.
587   expectOperationValueResult(operator/, -30, -10, 3);
588   expectOperationValueResult(operator/, -34, -17, 2);
589 
590   // Test both positive values.
591   expectOperationValueResult(operator/, 30, 10, 3);
592   expectOperationValueResult(operator/, 34, 17, 2);
593   expectOperationValueResult(operator/, 0, 10, 0);
594 
595   // Test divide by zero.
596   expectOperationValueResult(operator/, -10, 0);
597   expectOperationValueResult(operator/, 10, 0);
598   expectOperationValueResult(operator/, 0, 0);
599 
600   // Test negative result that underflows.
601   expectOperationValueResult(operator/, MaxUint64, -1);
602   expectOperationValueResult(operator/, AbsoluteMaxInt64 + 2, -1);
603 }
604 
605 TEST_F(FileCheckTest, ExpressionValueEquality) {
606   // Test negative and positive value.
607   EXPECT_FALSE(ExpressionValue(5) == ExpressionValue(-3));
608   EXPECT_TRUE(ExpressionValue(5) != ExpressionValue(-3));
609   EXPECT_FALSE(ExpressionValue(-2) == ExpressionValue(6));
610   EXPECT_TRUE(ExpressionValue(-2) != ExpressionValue(6));
611   EXPECT_FALSE(ExpressionValue(-7) == ExpressionValue(7));
612   EXPECT_TRUE(ExpressionValue(-7) != ExpressionValue(7));
613   EXPECT_FALSE(ExpressionValue(4) == ExpressionValue(-4));
614   EXPECT_TRUE(ExpressionValue(4) != ExpressionValue(-4));
615   EXPECT_FALSE(ExpressionValue(MaxUint64) == ExpressionValue(-1));
616   EXPECT_TRUE(ExpressionValue(MaxUint64) != ExpressionValue(-1));
617 
618   // Test both negative values.
619   EXPECT_FALSE(ExpressionValue(-2) == ExpressionValue(-7));
620   EXPECT_TRUE(ExpressionValue(-2) != ExpressionValue(-7));
621   EXPECT_TRUE(ExpressionValue(-3) == ExpressionValue(-3));
622   EXPECT_FALSE(ExpressionValue(-3) != ExpressionValue(-3));
623   EXPECT_FALSE(ExpressionValue(MinInt64) == ExpressionValue(-1));
624   EXPECT_TRUE(ExpressionValue(MinInt64) != ExpressionValue(-1));
625   EXPECT_FALSE(ExpressionValue(MinInt64) == ExpressionValue(-0));
626   EXPECT_TRUE(ExpressionValue(MinInt64) != ExpressionValue(-0));
627 
628   // Test both positive values.
629   EXPECT_FALSE(ExpressionValue(8) == ExpressionValue(9));
630   EXPECT_TRUE(ExpressionValue(8) != ExpressionValue(9));
631   EXPECT_TRUE(ExpressionValue(1) == ExpressionValue(1));
632   EXPECT_FALSE(ExpressionValue(1) != ExpressionValue(1));
633 
634   // Check the signedness of zero doesn't affect equality.
635   EXPECT_TRUE(ExpressionValue(0) == ExpressionValue(0));
636   EXPECT_FALSE(ExpressionValue(0) != ExpressionValue(0));
637   EXPECT_TRUE(ExpressionValue(0) == ExpressionValue(-0));
638   EXPECT_FALSE(ExpressionValue(0) != ExpressionValue(-0));
639   EXPECT_TRUE(ExpressionValue(-0) == ExpressionValue(0));
640   EXPECT_FALSE(ExpressionValue(-0) != ExpressionValue(0));
641   EXPECT_TRUE(ExpressionValue(-0) == ExpressionValue(-0));
642   EXPECT_FALSE(ExpressionValue(-0) != ExpressionValue(-0));
643 }
644 
645 TEST_F(FileCheckTest, Literal) {
646   SourceMgr SM;
647 
648   // Eval returns the literal's value.
649   ExpressionLiteral Ten(bufferize(SM, "10"), 10u);
650   Expected<ExpressionValue> Value = Ten.eval();
651   ASSERT_THAT_EXPECTED(Value, Succeeded());
652   EXPECT_EQ(10, cantFail(Value->getSignedValue()));
653   Expected<ExpressionFormat> ImplicitFormat = Ten.getImplicitFormat(SM);
654   ASSERT_THAT_EXPECTED(ImplicitFormat, Succeeded());
655   EXPECT_EQ(*ImplicitFormat, ExpressionFormat::Kind::NoFormat);
656 
657   // Min value can be correctly represented.
658   ExpressionLiteral Min(bufferize(SM, std::to_string(MinInt64)), MinInt64);
659   Value = Min.eval();
660   ASSERT_TRUE(bool(Value));
661   EXPECT_EQ(MinInt64, cantFail(Value->getSignedValue()));
662 
663   // Max value can be correctly represented.
664   ExpressionLiteral Max(bufferize(SM, std::to_string(MaxUint64)), MaxUint64);
665   Value = Max.eval();
666   ASSERT_THAT_EXPECTED(Value, Succeeded());
667   EXPECT_EQ(MaxUint64, cantFail(Value->getUnsignedValue()));
668 }
669 
670 TEST_F(FileCheckTest, Expression) {
671   SourceMgr SM;
672 
673   std::unique_ptr<ExpressionLiteral> Ten =
674       std::make_unique<ExpressionLiteral>(bufferize(SM, "10"), 10u);
675   ExpressionLiteral *TenPtr = Ten.get();
676   Expression Expr(std::move(Ten),
677                   ExpressionFormat(ExpressionFormat::Kind::HexLower));
678   EXPECT_EQ(Expr.getAST(), TenPtr);
679   EXPECT_EQ(Expr.getFormat(), ExpressionFormat::Kind::HexLower);
680 }
681 
682 static void
683 expectUndefErrors(std::unordered_set<std::string> ExpectedUndefVarNames,
684                   Error Err) {
685   EXPECT_THAT_ERROR(handleErrors(std::move(Err),
686                                  [&](const UndefVarError &E) {
687                                    EXPECT_EQ(ExpectedUndefVarNames.erase(
688                                                  std::string(E.getVarName())),
689                                              1U);
690                                  }),
691                     Succeeded());
692   EXPECT_TRUE(ExpectedUndefVarNames.empty()) << toString(ExpectedUndefVarNames);
693 }
694 
695 TEST_F(FileCheckTest, NumericVariable) {
696   SourceMgr SM;
697 
698   // Undefined variable: getValue and eval fail, error returned by eval holds
699   // the name of the undefined variable.
700   NumericVariable FooVar("FOO",
701                          ExpressionFormat(ExpressionFormat::Kind::Unsigned), 1);
702   EXPECT_EQ("FOO", FooVar.getName());
703   EXPECT_EQ(FooVar.getImplicitFormat(), ExpressionFormat::Kind::Unsigned);
704   NumericVariableUse FooVarUse("FOO", &FooVar);
705   Expected<ExpressionFormat> ImplicitFormat = FooVarUse.getImplicitFormat(SM);
706   ASSERT_THAT_EXPECTED(ImplicitFormat, Succeeded());
707   EXPECT_EQ(*ImplicitFormat, ExpressionFormat::Kind::Unsigned);
708   EXPECT_FALSE(FooVar.getValue());
709   Expected<ExpressionValue> EvalResult = FooVarUse.eval();
710   expectUndefErrors({"FOO"}, EvalResult.takeError());
711 
712   // Defined variable without string: only getValue and eval return value set.
713   FooVar.setValue(ExpressionValue(42u));
714   Optional<ExpressionValue> Value = FooVar.getValue();
715   ASSERT_TRUE(Value);
716   EXPECT_EQ(42, cantFail(Value->getSignedValue()));
717   EXPECT_FALSE(FooVar.getStringValue());
718   EvalResult = FooVarUse.eval();
719   ASSERT_THAT_EXPECTED(EvalResult, Succeeded());
720   EXPECT_EQ(42, cantFail(EvalResult->getSignedValue()));
721 
722   // Defined variable with string: getValue, eval, and getStringValue return
723   // value set.
724   StringRef StringValue = "925";
725   FooVar.setValue(ExpressionValue(925u), StringValue);
726   Value = FooVar.getValue();
727   ASSERT_TRUE(Value);
728   EXPECT_EQ(925, cantFail(Value->getSignedValue()));
729   // getStringValue should return the same memory not just the same characters.
730   EXPECT_EQ(StringValue.begin(), FooVar.getStringValue().getValue().begin());
731   EXPECT_EQ(StringValue.end(), FooVar.getStringValue().getValue().end());
732   EvalResult = FooVarUse.eval();
733   ASSERT_THAT_EXPECTED(EvalResult, Succeeded());
734   EXPECT_EQ(925, cantFail(EvalResult->getSignedValue()));
735   EXPECT_EQ(925, cantFail(EvalResult->getSignedValue()));
736 
737   // Clearing variable: getValue and eval fail. Error returned by eval holds
738   // the name of the cleared variable.
739   FooVar.clearValue();
740   EXPECT_FALSE(FooVar.getValue());
741   EXPECT_FALSE(FooVar.getStringValue());
742   EvalResult = FooVarUse.eval();
743   expectUndefErrors({"FOO"}, EvalResult.takeError());
744 }
745 
746 TEST_F(FileCheckTest, Binop) {
747   SourceMgr SM;
748 
749   StringRef ExprStr = bufferize(SM, "FOO+BAR");
750   StringRef FooStr = ExprStr.take_front(3);
751   NumericVariable FooVar(FooStr,
752                          ExpressionFormat(ExpressionFormat::Kind::Unsigned), 1);
753   FooVar.setValue(ExpressionValue(42u));
754   std::unique_ptr<NumericVariableUse> FooVarUse =
755       std::make_unique<NumericVariableUse>(FooStr, &FooVar);
756   StringRef BarStr = ExprStr.take_back(3);
757   NumericVariable BarVar(BarStr,
758                          ExpressionFormat(ExpressionFormat::Kind::Unsigned), 2);
759   BarVar.setValue(ExpressionValue(18u));
760   std::unique_ptr<NumericVariableUse> BarVarUse =
761       std::make_unique<NumericVariableUse>(BarStr, &BarVar);
762   binop_eval_t doAdd = operator+;
763   BinaryOperation Binop(ExprStr, doAdd, std::move(FooVarUse),
764                         std::move(BarVarUse));
765 
766   // Defined variables: eval returns right value; implicit format is as
767   // expected.
768   Expected<ExpressionValue> Value = Binop.eval();
769   ASSERT_THAT_EXPECTED(Value, Succeeded());
770   EXPECT_EQ(60, cantFail(Value->getSignedValue()));
771   Expected<ExpressionFormat> ImplicitFormat = Binop.getImplicitFormat(SM);
772   ASSERT_THAT_EXPECTED(ImplicitFormat, Succeeded());
773   EXPECT_EQ(*ImplicitFormat, ExpressionFormat::Kind::Unsigned);
774 
775   // 1 undefined variable: eval fails, error contains name of undefined
776   // variable.
777   FooVar.clearValue();
778   Value = Binop.eval();
779   expectUndefErrors({"FOO"}, Value.takeError());
780 
781   // 2 undefined variables: eval fails, error contains names of all undefined
782   // variables.
783   BarVar.clearValue();
784   Value = Binop.eval();
785   expectUndefErrors({"FOO", "BAR"}, Value.takeError());
786 
787   // Literal + Variable has format of variable.
788   ExprStr = bufferize(SM, "FOO+18");
789   FooStr = ExprStr.take_front(3);
790   StringRef EighteenStr = ExprStr.take_back(2);
791   FooVarUse = std::make_unique<NumericVariableUse>(FooStr, &FooVar);
792   std::unique_ptr<ExpressionLiteral> Eighteen =
793       std::make_unique<ExpressionLiteral>(EighteenStr, 18u);
794   Binop = BinaryOperation(ExprStr, doAdd, std::move(FooVarUse),
795                           std::move(Eighteen));
796   ImplicitFormat = Binop.getImplicitFormat(SM);
797   ASSERT_THAT_EXPECTED(ImplicitFormat, Succeeded());
798   EXPECT_EQ(*ImplicitFormat, ExpressionFormat::Kind::Unsigned);
799   ExprStr = bufferize(SM, "18+FOO");
800   FooStr = ExprStr.take_back(3);
801   EighteenStr = ExprStr.take_front(2);
802   FooVarUse = std::make_unique<NumericVariableUse>(FooStr, &FooVar);
803   Eighteen = std::make_unique<ExpressionLiteral>(EighteenStr, 18u);
804   Binop = BinaryOperation(ExprStr, doAdd, std::move(Eighteen),
805                           std::move(FooVarUse));
806   ImplicitFormat = Binop.getImplicitFormat(SM);
807   ASSERT_THAT_EXPECTED(ImplicitFormat, Succeeded());
808   EXPECT_EQ(*ImplicitFormat, ExpressionFormat::Kind::Unsigned);
809 
810   // Variables with different implicit format conflict.
811   ExprStr = bufferize(SM, "FOO+BAZ");
812   FooStr = ExprStr.take_front(3);
813   StringRef BazStr = ExprStr.take_back(3);
814   NumericVariable BazVar(BazStr,
815                          ExpressionFormat(ExpressionFormat::Kind::HexLower), 3);
816   FooVarUse = std::make_unique<NumericVariableUse>(FooStr, &FooVar);
817   std::unique_ptr<NumericVariableUse> BazVarUse =
818       std::make_unique<NumericVariableUse>(BazStr, &BazVar);
819   Binop = BinaryOperation(ExprStr, doAdd, std::move(FooVarUse),
820                           std::move(BazVarUse));
821   ImplicitFormat = Binop.getImplicitFormat(SM);
822   expectDiagnosticError(
823       "implicit format conflict between 'FOO' (%u) and 'BAZ' (%x), "
824       "need an explicit format specifier",
825       ImplicitFormat.takeError());
826 
827   // All variable conflicts are reported.
828   ExprStr = bufferize(SM, "(FOO+BAZ)+(FOO+QUUX)");
829   StringRef Paren1ExprStr = ExprStr.substr(1, 7);
830   FooStr = Paren1ExprStr.take_front(3);
831   BazStr = Paren1ExprStr.take_back(3);
832   StringRef Paren2ExprStr = ExprStr.substr(ExprStr.rfind('(') + 1, 8);
833   StringRef FooStr2 = Paren2ExprStr.take_front(3);
834   StringRef QuuxStr = Paren2ExprStr.take_back(4);
835   FooVarUse = std::make_unique<NumericVariableUse>(FooStr, &FooVar);
836   BazVarUse = std::make_unique<NumericVariableUse>(BazStr, &BazVar);
837   std::unique_ptr<NumericVariableUse> FooVarUse2 =
838       std::make_unique<NumericVariableUse>(FooStr2, &FooVar);
839   NumericVariable QuuxVar(
840       QuuxStr, ExpressionFormat(ExpressionFormat::Kind::HexLower), 4);
841   std::unique_ptr<NumericVariableUse> QuuxVarUse =
842       std::make_unique<NumericVariableUse>(QuuxStr, &QuuxVar);
843   std::unique_ptr<BinaryOperation> Binop1 = std::make_unique<BinaryOperation>(
844       ExprStr.take_front(9), doAdd, std::move(FooVarUse), std::move(BazVarUse));
845   std::unique_ptr<BinaryOperation> Binop2 = std::make_unique<BinaryOperation>(
846       ExprStr.take_back(10), doAdd, std::move(FooVarUse2),
847       std::move(QuuxVarUse));
848   std::unique_ptr<BinaryOperation> OuterBinop =
849       std::make_unique<BinaryOperation>(ExprStr, doAdd, std::move(Binop1),
850                                         std::move(Binop2));
851   ImplicitFormat = OuterBinop->getImplicitFormat(SM);
852   expectSameErrors<ErrorDiagnostic>(
853       {("implicit format conflict between 'FOO' (%u) and 'BAZ' (%x), need an "
854        "explicit format specifier"),
855        ("implicit format conflict between 'FOO' (%u) and 'QUUX' (%x), need an "
856        "explicit format specifier")},
857       ImplicitFormat.takeError());
858 }
859 
860 TEST_F(FileCheckTest, ValidVarNameStart) {
861   EXPECT_TRUE(Pattern::isValidVarNameStart('a'));
862   EXPECT_TRUE(Pattern::isValidVarNameStart('G'));
863   EXPECT_TRUE(Pattern::isValidVarNameStart('_'));
864   EXPECT_FALSE(Pattern::isValidVarNameStart('2'));
865   EXPECT_FALSE(Pattern::isValidVarNameStart('$'));
866   EXPECT_FALSE(Pattern::isValidVarNameStart('@'));
867   EXPECT_FALSE(Pattern::isValidVarNameStart('+'));
868   EXPECT_FALSE(Pattern::isValidVarNameStart('-'));
869   EXPECT_FALSE(Pattern::isValidVarNameStart(':'));
870 }
871 
872 TEST_F(FileCheckTest, ParseVar) {
873   SourceMgr SM;
874   StringRef OrigVarName = bufferize(SM, "GoodVar42");
875   StringRef VarName = OrigVarName;
876   Expected<Pattern::VariableProperties> ParsedVarResult =
877       Pattern::parseVariable(VarName, SM);
878   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
879   EXPECT_EQ(ParsedVarResult->Name, OrigVarName);
880   EXPECT_TRUE(VarName.empty());
881   EXPECT_FALSE(ParsedVarResult->IsPseudo);
882 
883   VarName = OrigVarName = bufferize(SM, "$GoodGlobalVar");
884   ParsedVarResult = Pattern::parseVariable(VarName, SM);
885   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
886   EXPECT_EQ(ParsedVarResult->Name, OrigVarName);
887   EXPECT_TRUE(VarName.empty());
888   EXPECT_FALSE(ParsedVarResult->IsPseudo);
889 
890   VarName = OrigVarName = bufferize(SM, "@GoodPseudoVar");
891   ParsedVarResult = Pattern::parseVariable(VarName, SM);
892   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
893   EXPECT_EQ(ParsedVarResult->Name, OrigVarName);
894   EXPECT_TRUE(VarName.empty());
895   EXPECT_TRUE(ParsedVarResult->IsPseudo);
896 
897   VarName = bufferize(SM, "42BadVar");
898   ParsedVarResult = Pattern::parseVariable(VarName, SM);
899   expectDiagnosticError("invalid variable name", ParsedVarResult.takeError());
900 
901   VarName = bufferize(SM, "$@");
902   ParsedVarResult = Pattern::parseVariable(VarName, SM);
903   expectDiagnosticError("invalid variable name", ParsedVarResult.takeError());
904 
905   VarName = OrigVarName = bufferize(SM, "B@dVar");
906   ParsedVarResult = Pattern::parseVariable(VarName, SM);
907   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
908   EXPECT_EQ(VarName, OrigVarName.substr(1));
909   EXPECT_EQ(ParsedVarResult->Name, "B");
910   EXPECT_FALSE(ParsedVarResult->IsPseudo);
911 
912   VarName = OrigVarName = bufferize(SM, "B$dVar");
913   ParsedVarResult = Pattern::parseVariable(VarName, SM);
914   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
915   EXPECT_EQ(VarName, OrigVarName.substr(1));
916   EXPECT_EQ(ParsedVarResult->Name, "B");
917   EXPECT_FALSE(ParsedVarResult->IsPseudo);
918 
919   VarName = bufferize(SM, "BadVar+");
920   ParsedVarResult = Pattern::parseVariable(VarName, SM);
921   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
922   EXPECT_EQ(VarName, "+");
923   EXPECT_EQ(ParsedVarResult->Name, "BadVar");
924   EXPECT_FALSE(ParsedVarResult->IsPseudo);
925 
926   VarName = bufferize(SM, "BadVar-");
927   ParsedVarResult = Pattern::parseVariable(VarName, SM);
928   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
929   EXPECT_EQ(VarName, "-");
930   EXPECT_EQ(ParsedVarResult->Name, "BadVar");
931   EXPECT_FALSE(ParsedVarResult->IsPseudo);
932 
933   VarName = bufferize(SM, "BadVar:");
934   ParsedVarResult = Pattern::parseVariable(VarName, SM);
935   ASSERT_THAT_EXPECTED(ParsedVarResult, Succeeded());
936   EXPECT_EQ(VarName, ":");
937   EXPECT_EQ(ParsedVarResult->Name, "BadVar");
938   EXPECT_FALSE(ParsedVarResult->IsPseudo);
939 }
940 
941 static void expectNotFoundError(Error Err) {
942   expectError<NotFoundError>("String not found in input", std::move(Err));
943 }
944 
945 class PatternTester {
946 private:
947   size_t LineNumber = 1;
948   SourceMgr SM;
949   FileCheckRequest Req;
950   FileCheckPatternContext Context;
951   Pattern P{Check::CheckPlain, &Context, LineNumber};
952 
953 public:
954   PatternTester() {
955     std::vector<StringRef> GlobalDefines = {"#FOO=42", "BAR=BAZ", "#add=7"};
956     // An ASSERT_FALSE would make more sense but cannot be used in a
957     // constructor.
958     EXPECT_THAT_ERROR(Context.defineCmdlineVariables(GlobalDefines, SM),
959                       Succeeded());
960     Context.createLineVariable();
961     // Call parsePattern to have @LINE defined.
962     P.parsePattern("N/A", "CHECK", SM, Req);
963     // parsePattern does not expect to be called twice for the same line and
964     // will set FixedStr and RegExStr incorrectly if it is. Therefore prepare
965     // a pattern for a different line.
966     initNextPattern();
967   }
968 
969   void initNextPattern() {
970     P = Pattern(Check::CheckPlain, &Context, ++LineNumber);
971   }
972 
973   size_t getLineNumber() const { return LineNumber; }
974 
975   Expected<std::unique_ptr<Expression>>
976   parseSubst(StringRef Expr, bool IsLegacyLineExpr = false) {
977     StringRef ExprBufferRef = bufferize(SM, Expr);
978     Optional<NumericVariable *> DefinedNumericVariable;
979     return P.parseNumericSubstitutionBlock(
980         ExprBufferRef, DefinedNumericVariable, IsLegacyLineExpr, LineNumber,
981         &Context, SM);
982   }
983 
984   bool parsePattern(StringRef Pattern) {
985     StringRef PatBufferRef = bufferize(SM, Pattern);
986     return P.parsePattern(PatBufferRef, "CHECK", SM, Req);
987   }
988 
989   Expected<size_t> match(StringRef Buffer) {
990     StringRef BufferRef = bufferize(SM, Buffer);
991     size_t MatchLen;
992     return P.match(BufferRef, MatchLen, SM);
993   }
994 
995   void printVariableDefs(FileCheckDiag::MatchType MatchTy,
996                          std::vector<FileCheckDiag> &Diags) {
997     P.printVariableDefs(SM, MatchTy, &Diags);
998   }
999 };
1000 
1001 TEST_F(FileCheckTest, ParseNumericSubstitutionBlock) {
1002   PatternTester Tester;
1003 
1004   // Variable definition.
1005 
1006   expectDiagnosticError("invalid variable name",
1007                         Tester.parseSubst("%VAR:").takeError());
1008 
1009   expectDiagnosticError("definition of pseudo numeric variable unsupported",
1010                         Tester.parseSubst("@LINE:").takeError());
1011 
1012   expectDiagnosticError("string variable with name 'BAR' already exists",
1013                         Tester.parseSubst("BAR:").takeError());
1014 
1015   expectDiagnosticError("unexpected characters after numeric variable name",
1016                         Tester.parseSubst("VAR GARBAGE:").takeError());
1017 
1018   // Change of format.
1019   expectDiagnosticError("format different from previous variable definition",
1020                         Tester.parseSubst("%X,FOO:").takeError());
1021 
1022   // Invalid format.
1023   expectDiagnosticError("invalid matching format specification in expression",
1024                         Tester.parseSubst("X,VAR1:").takeError());
1025   expectDiagnosticError("invalid format specifier in expression",
1026                         Tester.parseSubst("%F,VAR1:").takeError());
1027   expectDiagnosticError("invalid matching format specification in expression",
1028                         Tester.parseSubst("%X a,VAR1:").takeError());
1029 
1030   // Acceptable variable definition.
1031   EXPECT_THAT_EXPECTED(Tester.parseSubst("VAR1:"), Succeeded());
1032   EXPECT_THAT_EXPECTED(Tester.parseSubst("  VAR2:"), Succeeded());
1033   EXPECT_THAT_EXPECTED(Tester.parseSubst("VAR3  :"), Succeeded());
1034   EXPECT_THAT_EXPECTED(Tester.parseSubst("VAR3:  "), Succeeded());
1035 
1036   // Acceptable variable definition with format specifier. Use parsePattern for
1037   // variables whose definition needs to be visible for later checks.
1038   EXPECT_FALSE(Tester.parsePattern("[[#%u, VAR_UNSIGNED:]]"));
1039   EXPECT_FALSE(Tester.parsePattern("[[#%x, VAR_LOWER_HEX:]]"));
1040   EXPECT_THAT_EXPECTED(Tester.parseSubst("%X, VAR_UPPER_HEX:"), Succeeded());
1041 
1042   // Acceptable variable definition with precision specifier.
1043   EXPECT_FALSE(Tester.parsePattern("[[#%.8X, PADDED_ADDR:]]"));
1044   EXPECT_FALSE(Tester.parsePattern("[[#%.8, PADDED_NUM:]]"));
1045 
1046   // Acceptable variable definition from a numeric expression.
1047   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOOBAR: FOO+1"), Succeeded());
1048 
1049   // Numeric expression. Switch to next line to make above valid definition
1050   // available in expressions.
1051   Tester.initNextPattern();
1052 
1053   // Invalid variable name.
1054   expectDiagnosticError("invalid matching constraint or operand format",
1055                         Tester.parseSubst("%VAR").takeError());
1056 
1057   expectDiagnosticError("invalid pseudo numeric variable '@FOO'",
1058                         Tester.parseSubst("@FOO").takeError());
1059 
1060   // parsePattern() is used here instead of parseSubst() for the variable to be
1061   // recorded in GlobalNumericVariableTable and thus appear defined to
1062   // parseNumericVariableUse(). Note that the same pattern object is used for
1063   // the parsePattern() and parseSubst() since no initNextPattern() is called,
1064   // thus appearing as being on the same line from the pattern's point of view.
1065   ASSERT_FALSE(Tester.parsePattern("[[#SAME_LINE_VAR:]]"));
1066   expectDiagnosticError("numeric variable 'SAME_LINE_VAR' defined earlier in "
1067                         "the same CHECK directive",
1068                         Tester.parseSubst("SAME_LINE_VAR").takeError());
1069 
1070   // Invalid use of variable defined on the same line from an expression not
1071   // using any variable defined on the same line.
1072   ASSERT_FALSE(Tester.parsePattern("[[#SAME_LINE_EXPR_VAR:@LINE+1]]"));
1073   expectDiagnosticError("numeric variable 'SAME_LINE_EXPR_VAR' defined earlier "
1074                         "in the same CHECK directive",
1075                         Tester.parseSubst("SAME_LINE_EXPR_VAR").takeError());
1076 
1077   // Valid use of undefined variable which creates the variable and record it
1078   // in GlobalNumericVariableTable.
1079   ASSERT_THAT_EXPECTED(Tester.parseSubst("UNDEF"), Succeeded());
1080   EXPECT_TRUE(Tester.parsePattern("[[UNDEF:.*]]"));
1081 
1082   // Invalid literal.
1083   expectDiagnosticError("unsupported operation 'U'",
1084                         Tester.parseSubst("42U").takeError());
1085 
1086   // Valid empty expression.
1087   EXPECT_THAT_EXPECTED(Tester.parseSubst(""), Succeeded());
1088 
1089   // Invalid equality matching constraint with empty expression.
1090   expectDiagnosticError("empty numeric expression should not have a constraint",
1091                         Tester.parseSubst("==").takeError());
1092 
1093   // Valid single operand expression.
1094   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO"), Succeeded());
1095   EXPECT_THAT_EXPECTED(Tester.parseSubst("18"), Succeeded());
1096   EXPECT_THAT_EXPECTED(Tester.parseSubst(std::to_string(MaxUint64)),
1097                        Succeeded());
1098   EXPECT_THAT_EXPECTED(Tester.parseSubst("0x12"), Succeeded());
1099   EXPECT_THAT_EXPECTED(Tester.parseSubst("-30"), Succeeded());
1100   EXPECT_THAT_EXPECTED(Tester.parseSubst(std::to_string(MinInt64)),
1101                        Succeeded());
1102 
1103   // Valid optional matching constraint.
1104   EXPECT_THAT_EXPECTED(Tester.parseSubst("==FOO"), Succeeded());
1105 
1106   // Invalid matching constraint.
1107   expectDiagnosticError("invalid matching constraint or operand format",
1108                         Tester.parseSubst("+=FOO").takeError());
1109 
1110   // Invalid format.
1111   expectDiagnosticError("invalid matching format specification in expression",
1112                         Tester.parseSubst("X,FOO:").takeError());
1113   expectDiagnosticError("invalid format specifier in expression",
1114                         Tester.parseSubst("%F,FOO").takeError());
1115   expectDiagnosticError("invalid matching format specification in expression",
1116                         Tester.parseSubst("%X a,FOO").takeError());
1117 
1118   // Valid expression with 2 or more operands.
1119   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO+3"), Succeeded());
1120   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO+0xC"), Succeeded());
1121   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO-3+FOO"), Succeeded());
1122 
1123   expectDiagnosticError("unsupported operation '/'",
1124                         Tester.parseSubst("@LINE/2").takeError());
1125 
1126   expectDiagnosticError("missing operand in expression",
1127                         Tester.parseSubst("@LINE+").takeError());
1128 
1129   // Errors in RHS operand are bubbled up by parseBinop() to
1130   // parseNumericSubstitutionBlock().
1131   expectDiagnosticError("invalid operand format",
1132                         Tester.parseSubst("@LINE+%VAR").takeError());
1133 
1134   // Invalid legacy @LINE expression with non literal rhs.
1135   expectDiagnosticError(
1136       "invalid operand format",
1137       Tester.parseSubst("@LINE+@LINE", /*IsLegacyNumExpr=*/true).takeError());
1138 
1139   // Invalid legacy @LINE expression made of a single literal.
1140   expectDiagnosticError(
1141       "invalid variable name",
1142       Tester.parseSubst("2", /*IsLegacyNumExpr=*/true).takeError());
1143 
1144   // Invalid hex literal in legacy @LINE expression.
1145   expectDiagnosticError(
1146       "unexpected characters at end of expression 'xC'",
1147       Tester.parseSubst("@LINE+0xC", /*LegacyLineExpr=*/true).takeError());
1148 
1149   // Valid expression with format specifier.
1150   EXPECT_THAT_EXPECTED(Tester.parseSubst("%u, FOO"), Succeeded());
1151   EXPECT_THAT_EXPECTED(Tester.parseSubst("%d, FOO"), Succeeded());
1152   EXPECT_THAT_EXPECTED(Tester.parseSubst("%x, FOO"), Succeeded());
1153   EXPECT_THAT_EXPECTED(Tester.parseSubst("%X, FOO"), Succeeded());
1154 
1155   // Valid expression with precision specifier.
1156   EXPECT_THAT_EXPECTED(Tester.parseSubst("%.8u, FOO"), Succeeded());
1157   EXPECT_THAT_EXPECTED(Tester.parseSubst("%.8, FOO"), Succeeded());
1158 
1159   // Valid legacy @LINE expression.
1160   EXPECT_THAT_EXPECTED(Tester.parseSubst("@LINE+2", /*IsLegacyNumExpr=*/true),
1161                        Succeeded());
1162 
1163   // Invalid legacy @LINE expression with more than 2 operands.
1164   expectDiagnosticError(
1165       "unexpected characters at end of expression '+@LINE'",
1166       Tester.parseSubst("@LINE+2+@LINE", /*IsLegacyNumExpr=*/true).takeError());
1167   expectDiagnosticError(
1168       "unexpected characters at end of expression '+2'",
1169       Tester.parseSubst("@LINE+2+2", /*IsLegacyNumExpr=*/true).takeError());
1170 
1171   // Valid expression with several variables when their implicit formats do not
1172   // conflict.
1173   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO+VAR_UNSIGNED"), Succeeded());
1174 
1175   // Valid implicit format conflict in presence of explicit formats.
1176   EXPECT_THAT_EXPECTED(Tester.parseSubst("%X,FOO+VAR_LOWER_HEX"), Succeeded());
1177 
1178   // Implicit format conflict.
1179   expectDiagnosticError(
1180       "implicit format conflict between 'FOO' (%u) and "
1181       "'VAR_LOWER_HEX' (%x), need an explicit format specifier",
1182       Tester.parseSubst("FOO+VAR_LOWER_HEX").takeError());
1183 
1184   // Simple parenthesized expressions:
1185   EXPECT_THAT_EXPECTED(Tester.parseSubst("(1)"), Succeeded());
1186   EXPECT_THAT_EXPECTED(Tester.parseSubst("(1+1)"), Succeeded());
1187   EXPECT_THAT_EXPECTED(Tester.parseSubst("(1)+1"), Succeeded());
1188   EXPECT_THAT_EXPECTED(Tester.parseSubst("((1)+1)"), Succeeded());
1189   EXPECT_THAT_EXPECTED(Tester.parseSubst("((1)+X)"), Succeeded());
1190   EXPECT_THAT_EXPECTED(Tester.parseSubst("((X)+Y)"), Succeeded());
1191 
1192   expectDiagnosticError("missing operand in expression",
1193                         Tester.parseSubst("(").takeError());
1194   expectDiagnosticError("missing ')' at end of nested expression",
1195                         Tester.parseSubst("(1").takeError());
1196   expectDiagnosticError("missing operand in expression",
1197                         Tester.parseSubst("(1+").takeError());
1198   expectDiagnosticError("missing ')' at end of nested expression",
1199                         Tester.parseSubst("(1+1").takeError());
1200   expectDiagnosticError("missing ')' at end of nested expression",
1201                         Tester.parseSubst("((1+2+3").takeError());
1202   expectDiagnosticError("missing ')' at end of nested expression",
1203                         Tester.parseSubst("((1+2)+3").takeError());
1204 
1205   // Test missing operation between operands:
1206   expectDiagnosticError("unsupported operation '('",
1207                         Tester.parseSubst("(1)(2)").takeError());
1208   expectDiagnosticError("unsupported operation '('",
1209                         Tester.parseSubst("2(X)").takeError());
1210 
1211   // Test more closing than opening parentheses. The diagnostic messages are
1212   // not ideal, but for now simply check that we reject invalid input.
1213   expectDiagnosticError("invalid matching constraint or operand format",
1214                         Tester.parseSubst(")").takeError());
1215   expectDiagnosticError("unsupported operation ')'",
1216                         Tester.parseSubst("1)").takeError());
1217   expectDiagnosticError("unsupported operation ')'",
1218                         Tester.parseSubst("(1+2))").takeError());
1219   expectDiagnosticError("unsupported operation ')'",
1220                         Tester.parseSubst("(2))").takeError());
1221   expectDiagnosticError("unsupported operation ')'",
1222                         Tester.parseSubst("(1))(").takeError());
1223 
1224   // Valid expression with function call.
1225   EXPECT_THAT_EXPECTED(Tester.parseSubst("add(FOO,3)"), Succeeded());
1226   EXPECT_THAT_EXPECTED(Tester.parseSubst("add (FOO,3)"), Succeeded());
1227   // Valid expression with nested function call.
1228   EXPECT_THAT_EXPECTED(Tester.parseSubst("add(FOO, min(BAR,10))"), Succeeded());
1229   // Valid expression with function call taking expression as argument.
1230   EXPECT_THAT_EXPECTED(Tester.parseSubst("add(FOO, (BAR+10) + 3)"),
1231                        Succeeded());
1232   EXPECT_THAT_EXPECTED(Tester.parseSubst("add(FOO, min (BAR,10) + 3)"),
1233                        Succeeded());
1234   // Valid expression with variable named the same as a function.
1235   EXPECT_THAT_EXPECTED(Tester.parseSubst("add"), Succeeded());
1236   EXPECT_THAT_EXPECTED(Tester.parseSubst("add+FOO"), Succeeded());
1237   EXPECT_THAT_EXPECTED(Tester.parseSubst("FOO+add"), Succeeded());
1238   EXPECT_THAT_EXPECTED(Tester.parseSubst("add(add,add)+add"), Succeeded());
1239 
1240   // Malformed call syntax.
1241   expectDiagnosticError("missing ')' at end of call expression",
1242                         Tester.parseSubst("add(FOO,(BAR+7)").takeError());
1243   expectDiagnosticError("missing ')' at end of call expression",
1244                         Tester.parseSubst("add(FOO,min(BAR,7)").takeError());
1245   expectDiagnosticError("missing argument",
1246                         Tester.parseSubst("add(FOO,)").takeError());
1247   expectDiagnosticError("missing argument",
1248                         Tester.parseSubst("add(,FOO)").takeError());
1249   expectDiagnosticError("missing argument",
1250                         Tester.parseSubst("add(FOO,,3)").takeError());
1251 
1252   // Valid call, but to an unknown function.
1253   expectDiagnosticError("call to undefined function 'bogus_function'",
1254                         Tester.parseSubst("bogus_function(FOO,3)").takeError());
1255   expectDiagnosticError("call to undefined function '@add'",
1256                         Tester.parseSubst("@add(2,3)").takeError());
1257   expectDiagnosticError("call to undefined function '$add'",
1258                         Tester.parseSubst("$add(2,3)").takeError());
1259   expectDiagnosticError("call to undefined function 'FOO'",
1260                         Tester.parseSubst("FOO(2,3)").takeError());
1261   expectDiagnosticError("call to undefined function 'FOO'",
1262                         Tester.parseSubst("FOO (2,3)").takeError());
1263 
1264   // Valid call, but with incorrect argument count.
1265   expectDiagnosticError("function 'add' takes 2 arguments but 1 given",
1266                         Tester.parseSubst("add(FOO)").takeError());
1267   expectDiagnosticError("function 'add' takes 2 arguments but 3 given",
1268                         Tester.parseSubst("add(FOO,3,4)").takeError());
1269 
1270   // Valid call, but not part of a valid expression.
1271   expectDiagnosticError("unsupported operation 'a'",
1272                         Tester.parseSubst("2add(FOO,2)").takeError());
1273   expectDiagnosticError("unsupported operation 'a'",
1274                         Tester.parseSubst("FOO add(FOO,2)").takeError());
1275   expectDiagnosticError("unsupported operation 'a'",
1276                         Tester.parseSubst("add(FOO,2)add(FOO,2)").takeError());
1277 }
1278 
1279 TEST_F(FileCheckTest, ParsePattern) {
1280   PatternTester Tester;
1281 
1282   // Invalid space in string substitution.
1283   EXPECT_TRUE(Tester.parsePattern("[[ BAR]]"));
1284 
1285   // Invalid variable name in string substitution.
1286   EXPECT_TRUE(Tester.parsePattern("[[42INVALID]]"));
1287 
1288   // Invalid string variable definition.
1289   EXPECT_TRUE(Tester.parsePattern("[[@PAT:]]"));
1290   EXPECT_TRUE(Tester.parsePattern("[[PAT+2:]]"));
1291 
1292   // Collision with numeric variable.
1293   EXPECT_TRUE(Tester.parsePattern("[[FOO:]]"));
1294 
1295   // Valid use of string variable.
1296   EXPECT_FALSE(Tester.parsePattern("[[BAR]]"));
1297 
1298   // Valid string variable definition.
1299   EXPECT_FALSE(Tester.parsePattern("[[PAT:[0-9]+]]"));
1300 
1301   // Invalid numeric substitution.
1302   EXPECT_TRUE(Tester.parsePattern("[[#42INVALID]]"));
1303 
1304   // Valid numeric substitution.
1305   EXPECT_FALSE(Tester.parsePattern("[[#FOO]]"));
1306 
1307   // Valid legacy @LINE expression.
1308   EXPECT_FALSE(Tester.parsePattern("[[@LINE+2]]"));
1309 
1310   // Invalid legacy @LINE expression with non decimal literal.
1311   EXPECT_TRUE(Tester.parsePattern("[[@LINE+0x3]]"));
1312 }
1313 
1314 TEST_F(FileCheckTest, Match) {
1315   PatternTester Tester;
1316 
1317   // Check a substitution error is diagnosed.
1318   ASSERT_FALSE(Tester.parsePattern("[[#%u, -1]]"));
1319   expectDiagnosticError(
1320       "unable to substitute variable or numeric expression: overflow error",
1321       Tester.match("").takeError());
1322 
1323   // Check matching an empty expression only matches a number.
1324   Tester.initNextPattern();
1325   ASSERT_FALSE(Tester.parsePattern("[[#]]"));
1326   expectNotFoundError(Tester.match("FAIL").takeError());
1327   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1328 
1329   // Check matching a definition only matches a number with the right format.
1330   Tester.initNextPattern();
1331   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR:]]"));
1332   expectNotFoundError(Tester.match("FAIL").takeError());
1333   expectNotFoundError(Tester.match("").takeError());
1334   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1335   Tester.initNextPattern();
1336   Tester.parsePattern("[[#%u,NUMVAR_UNSIGNED:]]");
1337   expectNotFoundError(Tester.match("C").takeError());
1338   EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded());
1339   Tester.initNextPattern();
1340   Tester.parsePattern("[[#%x,NUMVAR_LOWER_HEX:]]");
1341   expectNotFoundError(Tester.match("g").takeError());
1342   expectNotFoundError(Tester.match("C").takeError());
1343   EXPECT_THAT_EXPECTED(Tester.match("c"), Succeeded());
1344   Tester.initNextPattern();
1345   Tester.parsePattern("[[#%X,NUMVAR_UPPER_HEX:]]");
1346   expectNotFoundError(Tester.match("H").takeError());
1347   expectNotFoundError(Tester.match("b").takeError());
1348   EXPECT_THAT_EXPECTED(Tester.match("B"), Succeeded());
1349 
1350   // Check matching expressions with no explicit format matches the values in
1351   // the right format.
1352   Tester.initNextPattern();
1353   Tester.parsePattern("[[#NUMVAR_UNSIGNED-5]]");
1354   expectNotFoundError(Tester.match("f").takeError());
1355   expectNotFoundError(Tester.match("F").takeError());
1356   EXPECT_THAT_EXPECTED(Tester.match("15"), Succeeded());
1357   Tester.initNextPattern();
1358   Tester.parsePattern("[[#NUMVAR_LOWER_HEX+1]]");
1359   expectNotFoundError(Tester.match("13").takeError());
1360   expectNotFoundError(Tester.match("D").takeError());
1361   EXPECT_THAT_EXPECTED(Tester.match("d"), Succeeded());
1362   Tester.initNextPattern();
1363   Tester.parsePattern("[[#NUMVAR_UPPER_HEX+1]]");
1364   expectNotFoundError(Tester.match("12").takeError());
1365   expectNotFoundError(Tester.match("c").takeError());
1366   EXPECT_THAT_EXPECTED(Tester.match("C"), Succeeded());
1367 
1368   // Check matching an undefined variable returns a NotFound error.
1369   Tester.initNextPattern();
1370   ASSERT_FALSE(Tester.parsePattern("100"));
1371   expectNotFoundError(Tester.match("101").takeError());
1372 
1373   // Check matching the defined variable matches the correct number only.
1374   Tester.initNextPattern();
1375   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR]]"));
1376   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1377 
1378   // Check matching several substitutions does not match them independently.
1379   Tester.initNextPattern();
1380   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR]] [[#NUMVAR+2]]"));
1381   expectNotFoundError(Tester.match("19 21").takeError());
1382   expectNotFoundError(Tester.match("18 21").takeError());
1383   EXPECT_THAT_EXPECTED(Tester.match("18 20"), Succeeded());
1384 
1385   // Check matching a numeric expression using @LINE after a match failure uses
1386   // the correct value for @LINE.
1387   Tester.initNextPattern();
1388   ASSERT_FALSE(Tester.parsePattern("[[#@LINE]]"));
1389   // Ok, @LINE matches the current line number.
1390   EXPECT_THAT_EXPECTED(Tester.match(std::to_string(Tester.getLineNumber())),
1391                        Succeeded());
1392   Tester.initNextPattern();
1393   // Match with substitution failure.
1394   ASSERT_FALSE(Tester.parsePattern("[[#UNKNOWN]]"));
1395   expectUndefErrors({"UNKNOWN"}, Tester.match("FOO").takeError());
1396   Tester.initNextPattern();
1397   // Check that @LINE matches the later (given the calls to initNextPattern())
1398   // line number.
1399   EXPECT_FALSE(Tester.parsePattern("[[#@LINE]]"));
1400   EXPECT_THAT_EXPECTED(Tester.match(std::to_string(Tester.getLineNumber())),
1401                        Succeeded());
1402 }
1403 
1404 TEST_F(FileCheckTest, MatchParen) {
1405   PatternTester Tester;
1406   // Check simple parenthesized expressions
1407   Tester.initNextPattern();
1408   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR:]]"));
1409   expectNotFoundError(Tester.match("FAIL").takeError());
1410   expectNotFoundError(Tester.match("").takeError());
1411   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1412 
1413   Tester.initNextPattern();
1414   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR + (2 + 2)]]"));
1415   expectNotFoundError(Tester.match("21").takeError());
1416   EXPECT_THAT_EXPECTED(Tester.match("22"), Succeeded());
1417   Tester.initNextPattern();
1418   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR + (2)]]"));
1419   EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded());
1420   Tester.initNextPattern();
1421   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(2)]]"));
1422   EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded());
1423   Tester.initNextPattern();
1424   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(NUMVAR)]]"));
1425   EXPECT_THAT_EXPECTED(Tester.match("36"), Succeeded());
1426 
1427   // Check nested parenthesized expressions:
1428   Tester.initNextPattern();
1429   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(2+(2))]]"));
1430   EXPECT_THAT_EXPECTED(Tester.match("22"), Succeeded());
1431   Tester.initNextPattern();
1432   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+(2+(NUMVAR))]]"));
1433   EXPECT_THAT_EXPECTED(Tester.match("38"), Succeeded());
1434   Tester.initNextPattern();
1435   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+((((NUMVAR))))]]"));
1436   EXPECT_THAT_EXPECTED(Tester.match("36"), Succeeded());
1437   Tester.initNextPattern();
1438   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR+((((NUMVAR)))-1)-1]]"));
1439   EXPECT_THAT_EXPECTED(Tester.match("34"), Succeeded());
1440 
1441   // Parentheses can also be the first character after the '#':
1442   Tester.initNextPattern();
1443   ASSERT_FALSE(Tester.parsePattern("[[#(NUMVAR)]]"));
1444   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1445   Tester.initNextPattern();
1446   ASSERT_FALSE(Tester.parsePattern("[[#(NUMVAR+2)]]"));
1447   EXPECT_THAT_EXPECTED(Tester.match("20"), Succeeded());
1448 }
1449 
1450 TEST_F(FileCheckTest, MatchBuiltinFunctions) {
1451   PatternTester Tester;
1452   // Esnure #NUMVAR has the expected value.
1453   Tester.initNextPattern();
1454   ASSERT_FALSE(Tester.parsePattern("[[#NUMVAR:]]"));
1455   expectNotFoundError(Tester.match("FAIL").takeError());
1456   expectNotFoundError(Tester.match("").takeError());
1457   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1458 
1459   // Check each builtin function generates the expected result.
1460   Tester.initNextPattern();
1461   ASSERT_FALSE(Tester.parsePattern("[[#add(NUMVAR,13)]]"));
1462   EXPECT_THAT_EXPECTED(Tester.match("31"), Succeeded());
1463   Tester.initNextPattern();
1464   ASSERT_FALSE(Tester.parsePattern("[[#div(NUMVAR,3)]]"));
1465   EXPECT_THAT_EXPECTED(Tester.match("6"), Succeeded());
1466   Tester.initNextPattern();
1467   ASSERT_FALSE(Tester.parsePattern("[[#max(NUMVAR,5)]]"));
1468   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1469   Tester.initNextPattern();
1470   ASSERT_FALSE(Tester.parsePattern("[[#max(NUMVAR,99)]]"));
1471   EXPECT_THAT_EXPECTED(Tester.match("99"), Succeeded());
1472   Tester.initNextPattern();
1473   ASSERT_FALSE(Tester.parsePattern("[[#min(NUMVAR,5)]]"));
1474   EXPECT_THAT_EXPECTED(Tester.match("5"), Succeeded());
1475   Tester.initNextPattern();
1476   ASSERT_FALSE(Tester.parsePattern("[[#min(NUMVAR,99)]]"));
1477   EXPECT_THAT_EXPECTED(Tester.match("18"), Succeeded());
1478   Tester.initNextPattern();
1479   ASSERT_FALSE(Tester.parsePattern("[[#mul(NUMVAR,3)]]"));
1480   EXPECT_THAT_EXPECTED(Tester.match("54"), Succeeded());
1481   Tester.initNextPattern();
1482   ASSERT_FALSE(Tester.parsePattern("[[#sub(NUMVAR,7)]]"));
1483   EXPECT_THAT_EXPECTED(Tester.match("11"), Succeeded());
1484 
1485   // Check nested function calls.
1486   Tester.initNextPattern();
1487   ASSERT_FALSE(Tester.parsePattern("[[#add(min(7,2),max(4,10))]]"));
1488   EXPECT_THAT_EXPECTED(Tester.match("12"), Succeeded());
1489 
1490   // Check function call that uses a variable of the same name.
1491   Tester.initNextPattern();
1492   ASSERT_FALSE(Tester.parsePattern("[[#add(add,add)+min (add,3)+add]]"));
1493   EXPECT_THAT_EXPECTED(Tester.match("24"), Succeeded());
1494 }
1495 
1496 TEST_F(FileCheckTest, Substitution) {
1497   SourceMgr SM;
1498   FileCheckPatternContext Context;
1499   EXPECT_THAT_ERROR(Context.defineCmdlineVariables({"FOO=BAR"}, SM),
1500                     Succeeded());
1501 
1502   // Substitution of an undefined string variable fails and error holds that
1503   // variable's name.
1504   StringSubstitution StringSubstitution(&Context, "VAR404", 42);
1505   Expected<std::string> SubstValue = StringSubstitution.getResult();
1506   expectUndefErrors({"VAR404"}, SubstValue.takeError());
1507 
1508   // Numeric substitution blocks constituted of defined numeric variables are
1509   // substituted for the variable's value.
1510   NumericVariable NVar("N", ExpressionFormat(ExpressionFormat::Kind::Unsigned),
1511                        1);
1512   NVar.setValue(ExpressionValue(10u));
1513   auto NVarUse = std::make_unique<NumericVariableUse>("N", &NVar);
1514   auto ExpressionN = std::make_unique<Expression>(
1515       std::move(NVarUse), ExpressionFormat(ExpressionFormat::Kind::HexUpper));
1516   NumericSubstitution SubstitutionN(&Context, "N", std::move(ExpressionN),
1517                                     /*InsertIdx=*/30);
1518   SubstValue = SubstitutionN.getResult();
1519   ASSERT_THAT_EXPECTED(SubstValue, Succeeded());
1520   EXPECT_EQ("A", *SubstValue);
1521 
1522   // Substitution of an undefined numeric variable fails, error holds name of
1523   // undefined variable.
1524   NVar.clearValue();
1525   SubstValue = SubstitutionN.getResult();
1526   expectUndefErrors({"N"}, SubstValue.takeError());
1527 
1528   // Substitution of a defined string variable returns the right value.
1529   Pattern P(Check::CheckPlain, &Context, 1);
1530   StringSubstitution = llvm::StringSubstitution(&Context, "FOO", 42);
1531   SubstValue = StringSubstitution.getResult();
1532   ASSERT_THAT_EXPECTED(SubstValue, Succeeded());
1533   EXPECT_EQ("BAR", *SubstValue);
1534 }
1535 
1536 TEST_F(FileCheckTest, FileCheckContext) {
1537   FileCheckPatternContext Cxt;
1538   SourceMgr SM;
1539 
1540   // No definition.
1541   EXPECT_THAT_ERROR(Cxt.defineCmdlineVariables({}, SM), Succeeded());
1542 
1543   // Missing equal sign.
1544   expectDiagnosticError("missing equal sign in global definition",
1545                         Cxt.defineCmdlineVariables({"LocalVar"}, SM));
1546   expectDiagnosticError("missing equal sign in global definition",
1547                         Cxt.defineCmdlineVariables({"#LocalNumVar"}, SM));
1548 
1549   // Empty variable name.
1550   expectDiagnosticError("empty variable name",
1551                         Cxt.defineCmdlineVariables({"=18"}, SM));
1552   expectDiagnosticError("empty variable name",
1553                         Cxt.defineCmdlineVariables({"#=18"}, SM));
1554 
1555   // Invalid variable name.
1556   expectDiagnosticError("invalid variable name",
1557                         Cxt.defineCmdlineVariables({"18LocalVar=18"}, SM));
1558   expectDiagnosticError("invalid variable name",
1559                         Cxt.defineCmdlineVariables({"#18LocalNumVar=18"}, SM));
1560 
1561   // Name conflict between pattern and numeric variable.
1562   expectDiagnosticError(
1563       "string variable with name 'LocalVar' already exists",
1564       Cxt.defineCmdlineVariables({"LocalVar=18", "#LocalVar=36"}, SM));
1565   Cxt = FileCheckPatternContext();
1566   expectDiagnosticError(
1567       "numeric variable with name 'LocalNumVar' already exists",
1568       Cxt.defineCmdlineVariables({"#LocalNumVar=18", "LocalNumVar=36"}, SM));
1569   Cxt = FileCheckPatternContext();
1570 
1571   // Invalid numeric value for numeric variable.
1572   expectUndefErrors({"x"}, Cxt.defineCmdlineVariables({"#LocalNumVar=x"}, SM));
1573 
1574   // Define local variables from command-line.
1575   std::vector<StringRef> GlobalDefines;
1576   // Clear local variables to remove dummy numeric variable x that
1577   // parseNumericSubstitutionBlock would have created and stored in
1578   // GlobalNumericVariableTable.
1579   Cxt.clearLocalVars();
1580   GlobalDefines.emplace_back("LocalVar=FOO");
1581   GlobalDefines.emplace_back("EmptyVar=");
1582   GlobalDefines.emplace_back("#LocalNumVar1=18");
1583   GlobalDefines.emplace_back("#%x,LocalNumVar2=LocalNumVar1+2");
1584   GlobalDefines.emplace_back("#LocalNumVar3=0xc");
1585   ASSERT_THAT_ERROR(Cxt.defineCmdlineVariables(GlobalDefines, SM), Succeeded());
1586 
1587   // Create @LINE pseudo numeric variable and check it is present by matching
1588   // it.
1589   size_t LineNumber = 1;
1590   Pattern P(Check::CheckPlain, &Cxt, LineNumber);
1591   FileCheckRequest Req;
1592   Cxt.createLineVariable();
1593   ASSERT_FALSE(P.parsePattern("[[@LINE]]", "CHECK", SM, Req));
1594   size_t MatchLen;
1595   ASSERT_THAT_EXPECTED(P.match("1", MatchLen, SM), Succeeded());
1596 
1597 #ifndef NDEBUG
1598   // Recreating @LINE pseudo numeric variable fails.
1599   EXPECT_DEATH(Cxt.createLineVariable(),
1600                "@LINE pseudo numeric variable already created");
1601 #endif
1602 
1603   // Check defined variables are present and undefined ones are absent.
1604   StringRef LocalVarStr = "LocalVar";
1605   StringRef LocalNumVar1Ref = bufferize(SM, "LocalNumVar1");
1606   StringRef LocalNumVar2Ref = bufferize(SM, "LocalNumVar2");
1607   StringRef LocalNumVar3Ref = bufferize(SM, "LocalNumVar3");
1608   StringRef EmptyVarStr = "EmptyVar";
1609   StringRef UnknownVarStr = "UnknownVar";
1610   Expected<StringRef> LocalVar = Cxt.getPatternVarValue(LocalVarStr);
1611   P = Pattern(Check::CheckPlain, &Cxt, ++LineNumber);
1612   Optional<NumericVariable *> DefinedNumericVariable;
1613   Expected<std::unique_ptr<Expression>> ExpressionPointer =
1614       P.parseNumericSubstitutionBlock(LocalNumVar1Ref, DefinedNumericVariable,
1615                                       /*IsLegacyLineExpr=*/false, LineNumber,
1616                                       &Cxt, SM);
1617   ASSERT_THAT_EXPECTED(LocalVar, Succeeded());
1618   EXPECT_EQ(*LocalVar, "FOO");
1619   Expected<StringRef> EmptyVar = Cxt.getPatternVarValue(EmptyVarStr);
1620   Expected<StringRef> UnknownVar = Cxt.getPatternVarValue(UnknownVarStr);
1621   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1622   Expected<ExpressionValue> ExpressionVal =
1623       (*ExpressionPointer)->getAST()->eval();
1624   ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded());
1625   EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 18);
1626   ExpressionPointer = P.parseNumericSubstitutionBlock(
1627       LocalNumVar2Ref, DefinedNumericVariable,
1628       /*IsLegacyLineExpr=*/false, LineNumber, &Cxt, SM);
1629   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1630   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1631   ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded());
1632   EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 20);
1633   ExpressionPointer = P.parseNumericSubstitutionBlock(
1634       LocalNumVar3Ref, DefinedNumericVariable,
1635       /*IsLegacyLineExpr=*/false, LineNumber, &Cxt, SM);
1636   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1637   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1638   ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded());
1639   EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 12);
1640   ASSERT_THAT_EXPECTED(EmptyVar, Succeeded());
1641   EXPECT_EQ(*EmptyVar, "");
1642   expectUndefErrors({std::string(UnknownVarStr)}, UnknownVar.takeError());
1643 
1644   // Clear local variables and check they become absent.
1645   Cxt.clearLocalVars();
1646   LocalVar = Cxt.getPatternVarValue(LocalVarStr);
1647   expectUndefErrors({std::string(LocalVarStr)}, LocalVar.takeError());
1648   // Check a numeric expression's evaluation fails if called after clearing of
1649   // local variables, if it was created before. This is important because local
1650   // variable clearing due to --enable-var-scope happens after numeric
1651   // expressions are linked to the numeric variables they use.
1652   expectUndefErrors({"LocalNumVar3"},
1653                     (*ExpressionPointer)->getAST()->eval().takeError());
1654   P = Pattern(Check::CheckPlain, &Cxt, ++LineNumber);
1655   ExpressionPointer = P.parseNumericSubstitutionBlock(
1656       LocalNumVar1Ref, DefinedNumericVariable, /*IsLegacyLineExpr=*/false,
1657       LineNumber, &Cxt, SM);
1658   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1659   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1660   expectUndefErrors({"LocalNumVar1"}, ExpressionVal.takeError());
1661   ExpressionPointer = P.parseNumericSubstitutionBlock(
1662       LocalNumVar2Ref, DefinedNumericVariable, /*IsLegacyLineExpr=*/false,
1663       LineNumber, &Cxt, SM);
1664   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1665   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1666   expectUndefErrors({"LocalNumVar2"}, ExpressionVal.takeError());
1667   EmptyVar = Cxt.getPatternVarValue(EmptyVarStr);
1668   expectUndefErrors({"EmptyVar"}, EmptyVar.takeError());
1669   // Clear again because parseNumericSubstitutionBlock would have created a
1670   // dummy variable and stored it in GlobalNumericVariableTable.
1671   Cxt.clearLocalVars();
1672 
1673   // Redefine global variables and check variables are defined again.
1674   GlobalDefines.emplace_back("$GlobalVar=BAR");
1675   GlobalDefines.emplace_back("#$GlobalNumVar=36");
1676   ASSERT_THAT_ERROR(Cxt.defineCmdlineVariables(GlobalDefines, SM), Succeeded());
1677   StringRef GlobalVarStr = "$GlobalVar";
1678   StringRef GlobalNumVarRef = bufferize(SM, "$GlobalNumVar");
1679   Expected<StringRef> GlobalVar = Cxt.getPatternVarValue(GlobalVarStr);
1680   ASSERT_THAT_EXPECTED(GlobalVar, Succeeded());
1681   EXPECT_EQ(*GlobalVar, "BAR");
1682   P = Pattern(Check::CheckPlain, &Cxt, ++LineNumber);
1683   ExpressionPointer = P.parseNumericSubstitutionBlock(
1684       GlobalNumVarRef, DefinedNumericVariable, /*IsLegacyLineExpr=*/false,
1685       LineNumber, &Cxt, SM);
1686   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1687   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1688   ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded());
1689   EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 36);
1690 
1691   // Clear local variables and check global variables remain defined.
1692   Cxt.clearLocalVars();
1693   EXPECT_THAT_EXPECTED(Cxt.getPatternVarValue(GlobalVarStr), Succeeded());
1694   P = Pattern(Check::CheckPlain, &Cxt, ++LineNumber);
1695   ExpressionPointer = P.parseNumericSubstitutionBlock(
1696       GlobalNumVarRef, DefinedNumericVariable, /*IsLegacyLineExpr=*/false,
1697       LineNumber, &Cxt, SM);
1698   ASSERT_THAT_EXPECTED(ExpressionPointer, Succeeded());
1699   ExpressionVal = (*ExpressionPointer)->getAST()->eval();
1700   ASSERT_THAT_EXPECTED(ExpressionVal, Succeeded());
1701   EXPECT_EQ(cantFail(ExpressionVal->getSignedValue()), 36);
1702 }
1703 
1704 TEST_F(FileCheckTest, CapturedVarDiags) {
1705   PatternTester Tester;
1706   ASSERT_FALSE(Tester.parsePattern("[[STRVAR:[a-z]+]] [[#NUMVAR:@LINE]]"));
1707   EXPECT_THAT_EXPECTED(Tester.match("foobar 2"), Succeeded());
1708   std::vector<FileCheckDiag> Diags;
1709   Tester.printVariableDefs(FileCheckDiag::MatchFoundAndExpected, Diags);
1710   EXPECT_EQ(Diags.size(), 2ul);
1711   for (FileCheckDiag Diag : Diags) {
1712     EXPECT_EQ(Diag.CheckTy, Check::CheckPlain);
1713     EXPECT_EQ(Diag.MatchTy, FileCheckDiag::MatchFoundAndExpected);
1714     EXPECT_EQ(Diag.InputStartLine, 1u);
1715     EXPECT_EQ(Diag.InputEndLine, 1u);
1716   }
1717   EXPECT_EQ(Diags[0].InputStartCol, 1u);
1718   EXPECT_EQ(Diags[0].InputEndCol, 7u);
1719   EXPECT_EQ(Diags[1].InputStartCol, 8u);
1720   EXPECT_EQ(Diags[1].InputEndCol, 9u);
1721   EXPECT_EQ(Diags[0].Note, "captured var \"STRVAR\"");
1722   EXPECT_EQ(Diags[1].Note, "captured var \"NUMVAR\"");
1723 }
1724 } // namespace
1725