diff --git a/llvm/include/llvm/Support/FileCheck.h b/llvm/include/llvm/Support/FileCheck.h index dea68ba482c2e..b3a8433b54e65 100644 --- a/llvm/include/llvm/Support/FileCheck.h +++ b/llvm/include/llvm/Support/FileCheck.h @@ -69,13 +69,13 @@ class FileCheckNumericVariable { /// \returns this variable's value. Optional getValue() const { return Value; } - /// Sets value of this numeric variable if not defined. \returns whether the - /// variable was already defined. - bool setValue(uint64_t Value); + /// Sets value of this numeric variable, if undefined. Triggers an assertion + /// failure if the variable is actually defined. + void setValue(uint64_t Value); - /// Clears value of this numeric variable. \returns whether the variable was - /// already undefined. - bool clearValue(); + /// Clears value of this numeric variable, regardless of whether it is + /// currently defined or not. + void clearValue(); /// \returns the line number where this variable is defined. size_t getDefLineNumber() { return DefLineNumber; } diff --git a/llvm/lib/Support/FileCheck.cpp b/llvm/lib/Support/FileCheck.cpp index 93a3f0513fc59..5ec126f934e65 100644 --- a/llvm/lib/Support/FileCheck.cpp +++ b/llvm/lib/Support/FileCheck.cpp @@ -24,18 +24,15 @@ using namespace llvm; -bool FileCheckNumericVariable::setValue(uint64_t NewValue) { - if (Value) - return true; +void FileCheckNumericVariable::setValue(uint64_t NewValue) { + assert(!Value && "Overwriting numeric variable's value is not allowed"); Value = NewValue; - return false; } -bool FileCheckNumericVariable::clearValue() { +void FileCheckNumericVariable::clearValue() { if (!Value) - return true; + return; Value = None; - return false; } Expected FileCheckExpression::eval() const { @@ -625,8 +622,7 @@ Expected FileCheckPattern::match(StringRef Buffer, size_t &MatchLen, if (MatchedValue.getAsInteger(10, Val)) return FileCheckErrorDiagnostic::get(SM, MatchedValue, "Unable to represent numeric value"); - if (DefinedNumericVariable->setValue(Val)) - llvm_unreachable("Numeric variable redefined"); + DefinedNumericVariable->setValue(Val); } // Like CHECK-NEXT, CHECK-EMPTY's match range is considered to start after diff --git a/llvm/unittests/Support/FileCheckTest.cpp b/llvm/unittests/Support/FileCheckTest.cpp index 58550c7b7bde2..848ab15116bde 100644 --- a/llvm/unittests/Support/FileCheckTest.cpp +++ b/llvm/unittests/Support/FileCheckTest.cpp @@ -15,28 +15,23 @@ namespace { class FileCheckTest : public ::testing::Test {}; TEST_F(FileCheckTest, NumericVariable) { - // Undefined variable: getValue and clearValue fails, setValue works. + // Undefined variable: getValue fails, setValue does not trigger assert. FileCheckNumericVariable FooVar = FileCheckNumericVariable(1, "FOO"); EXPECT_EQ("FOO", FooVar.getName()); llvm::Optional Value = FooVar.getValue(); EXPECT_FALSE(Value); - EXPECT_TRUE(FooVar.clearValue()); - EXPECT_FALSE(FooVar.setValue(42)); + FooVar.clearValue(); + FooVar.setValue(42); - // Defined variable: getValue returns value set, setValue fails. - Value = FooVar.getValue(); - EXPECT_TRUE(Value); - EXPECT_EQ(42U, *Value); - EXPECT_TRUE(FooVar.setValue(43)); + // Defined variable: getValue returns value set. Value = FooVar.getValue(); EXPECT_TRUE(Value); EXPECT_EQ(42U, *Value); - // Clearing variable: getValue fails, clearValue again fails. - EXPECT_FALSE(FooVar.clearValue()); + // Clearing variable: getValue fails. + FooVar.clearValue(); Value = FooVar.getValue(); EXPECT_FALSE(Value); - EXPECT_TRUE(FooVar.clearValue()); } uint64_t doAdd(uint64_t OpL, uint64_t OpR) { return OpL + OpR; }