Skip to content

Commit 224de9f

Browse files
committed
Cover experimental pragmas and tests
1 parent 455fa7f commit 224de9f

File tree

63 files changed

+96
-8
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+96
-8
lines changed

libsolidity/analysis/SyntaxChecker.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ bool SyntaxChecker::visit(PragmaDirective const& _pragma)
8383
else if (_pragma.literals()[0] == "experimental")
8484
{
8585
solAssert(m_sourceUnit, "");
86+
if (!m_experimental)
87+
m_errorReporter.syntaxError(
88+
2816_error,
89+
_pragma.location(),
90+
"Experimental pragmas can only be used if the experimental mode has been enabled."
91+
);
8692
std::vector<std::string> literals(_pragma.literals().begin() + 1, _pragma.literals().end());
8793
if (literals.empty())
8894
m_errorReporter.syntaxError(

libsolidity/analysis/SyntaxChecker.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,12 @@ class SyntaxChecker: private ASTConstVisitor
4545
{
4646
public:
4747
/// @param _errorReporter provides the error logging functionality.
48-
SyntaxChecker(langutil::ErrorReporter& _errorReporter, bool _useYulOptimizer):
48+
/// @param _useYulOptimizer indicates whether Yul optimizer is enabled.
49+
/// @param _experimental indicates whether the experimental toggle (option) is enabled.
50+
SyntaxChecker(langutil::ErrorReporter& _errorReporter, bool _useYulOptimizer, bool _experimental):
4951
m_errorReporter(_errorReporter),
50-
m_useYulOptimizer(_useYulOptimizer)
52+
m_useYulOptimizer(_useYulOptimizer),
53+
m_experimental(_experimental)
5154
{}
5255

5356
bool checkSyntax(ASTNode const& _astRoot);
@@ -112,6 +115,9 @@ class SyntaxChecker: private ASTConstVisitor
112115
/// Flag that indicates whether we are inside an unchecked block.
113116
bool m_uncheckedArithmetic = false;
114117

118+
/// Flag that indicates whether experimental mode is toggled.
119+
bool m_experimental = false;
120+
115121
int m_inLoopDepth = 0;
116122
std::optional<ContractKind> m_currentContractKind;
117123

libsolidity/interface/CompilerStack.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ bool CompilerStack::analyze()
473473
{
474474
bool experimentalSolidity = isExperimentalSolidity();
475475

476-
SyntaxChecker syntaxChecker(m_errorReporter, m_optimiserSettings.runYulOptimiser);
476+
SyntaxChecker syntaxChecker(m_errorReporter, m_optimiserSettings.runYulOptimiser, m_experimental);
477477
for (Source const* source: m_sourceOrder)
478478
if (source->ast && !syntaxChecker.checkSyntax(*source->ast))
479479
noErrors = false;

test/libsolidity/Assembly.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ evmasm::AssemblyItems compileContract(std::shared_ptr<CharStream> _sourceCode)
6666
BOOST_CHECK(!!sourceUnit);
6767

6868
Scoper::assignScopes(*sourceUnit);
69-
BOOST_REQUIRE(SyntaxChecker(errorReporter, false).checkSyntax(*sourceUnit));
69+
BOOST_REQUIRE(SyntaxChecker(errorReporter, false, false).checkSyntax(*sourceUnit));
7070
GlobalContext globalContext(solidity::test::CommonOptions::get().evmVersion());
7171
NameAndTypeResolver resolver(globalContext, solidity::test::CommonOptions::get().evmVersion(), errorReporter, false);
7272
DeclarationTypeChecker declarationTypeChecker(errorReporter, solidity::test::CommonOptions::get().evmVersion());

test/libsolidity/FunctionDependencyGraphTest.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ TestCase::TestResult FunctionDependencyGraphTest::run(std::ostream& _stream, std
4242
compiler().setSources(StringMap{{"", m_source}});
4343
compiler().setViaIR(true);
4444
compiler().setOptimiserSettings(OptimiserSettings::none());
45+
// Experimental on by default as this is an extension of the initial experimental Solidity
46+
compiler().setExperimental(true);
4547
if (!compiler().compile(CompilerStack::AnalysisSuccessful))
4648
{
4749
printPrefixed(_stream, formatErrors(filteredErrors(), _formatted), _linePrefix);

test/libsolidity/FunctionDependencyGraphTest.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424

2525
#include <iosfwd>
2626
#include <string>
27-
#include <vector>
28-
#include <utility>
2927

3028
namespace solidity::frontend::test
3129
{

test/libsolidity/Metadata.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ BOOST_AUTO_TEST_CASE(metadata_stamp)
104104
compilerStack.setEVMVersion(solidity::test::CommonOptions::get().evmVersion());
105105
compilerStack.setOptimiserSettings(solidity::test::CommonOptions::get().optimize);
106106
compilerStack.setMetadataHash(metadataHash);
107+
compilerStack.setExperimental(true); // Experimental pragma requires it
107108
BOOST_REQUIRE_MESSAGE(compilerStack.compile(), "Compiling contract failed");
108109
bytes const& bytecode = compilerStack.runtimeObject("test").bytecode;
109110
std::string const& metadata = compilerStack.metadata("test");
@@ -177,6 +178,7 @@ BOOST_AUTO_TEST_CASE(metadata_stamp_experimental)
177178
compilerStack.setEVMVersion(solidity::test::CommonOptions::get().evmVersion());
178179
compilerStack.setOptimiserSettings(solidity::test::CommonOptions::get().optimize);
179180
compilerStack.setMetadataHash(metadataHash);
181+
compilerStack.setExperimental(true); // Experimental pragma requires it
180182
BOOST_REQUIRE_MESSAGE(compilerStack.compile(), "Compiling contract failed");
181183
bytes const& bytecode = compilerStack.runtimeObject("test").bytecode;
182184
std::string const& metadata = compilerStack.metadata("test");

test/libsolidity/SemanticTest.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ SemanticTest::SemanticTest(
112112
m_revertStrings = revertStrings.value();
113113

114114
m_allowNonExistingFunctions = m_reader.boolSetting("allowNonExistingFunctions", false);
115+
m_compiler.setExperimental(m_reader.boolSetting("experimental", false));
115116

116117
parseExpectations(m_reader.stream());
117118
soltestAssert(!m_tests.empty(), "No tests specified in " + _filename);

test/libsolidity/SolidityExpressionCompiler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ bytes compileFirstExpression(
126126
ErrorReporter errorReporter(errors);
127127
GlobalContext globalContext(solidity::test::CommonOptions::get().evmVersion());
128128
Scoper::assignScopes(*sourceUnit);
129-
BOOST_REQUIRE(SyntaxChecker(errorReporter, false).checkSyntax(*sourceUnit));
129+
BOOST_REQUIRE(SyntaxChecker(errorReporter, false, false).checkSyntax(*sourceUnit));
130130
NameAndTypeResolver resolver(globalContext, solidity::test::CommonOptions::get().evmVersion(), errorReporter, false);
131131
resolver.registerDeclarations(*sourceUnit);
132132
BOOST_REQUIRE_MESSAGE(resolver.resolveNamesAndTypes(*sourceUnit), "Resolving names failed");

test/libsolidity/SyntaxTest.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,14 @@ SyntaxTest::SyntaxTest(
5151
auto const eofEnabled = solidity::test::CommonOptions::get().eofVersion().has_value();
5252

5353
m_compileViaYul = m_reader.stringSetting("compileViaYul", eofEnabled ? "true" : "false");
54-
if (!util::contains(compileViaYulAllowedValues, m_compileViaYul))
54+
if (!compileViaYulAllowedValues.contains(m_compileViaYul))
5555
BOOST_THROW_EXCEPTION(std::runtime_error("Invalid compileViaYul value: " + m_compileViaYul + "."));
5656

5757
if (m_compileViaYul == "false" && eofEnabled)
5858
m_shouldRun = false;
5959

6060
m_optimiseYul = m_reader.boolSetting("optimize-yul", true);
61+
m_experimental = m_reader.boolSetting("experimental", false);
6162

6263
static std::map<std::string, PipelineStage> const pipelineStages = {
6364
{"parsing", PipelineStage::Parsing},
@@ -81,6 +82,7 @@ void SyntaxTest::setupCompiler(CompilerStack& _compiler)
8182
OptimiserSettings::minimal()
8283
);
8384
_compiler.setViaIR(m_compileViaYul == "true");
85+
_compiler.setExperimental(m_experimental);
8486
_compiler.setMetadataFormat(CompilerStack::MetadataFormat::NoMetadata);
8587
_compiler.setMetadataHash(CompilerStack::MetadataHash::None);
8688
}

0 commit comments

Comments
 (0)