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