Look for experimental pragmas in the module containing the definition when generating code for modifiers and inherited functions

This commit is contained in:
Kamil Śliwak
2020-10-12 14:29:53 +02:00
parent e7603d7590
commit 3128e82a9a
11 changed files with 264 additions and 0 deletions
+1
View File
@@ -78,6 +78,7 @@ public:
/// Update currently enabled set of experimental features.
void setExperimentalFeatures(std::set<ExperimentalFeature> const& _features) { m_experimentalFeatures = _features; }
std::set<ExperimentalFeature> const& experimentalFeaturesActive() const { return m_experimentalFeatures; }
/// @returns true if the given feature is enabled.
bool experimentalFeatureActive(ExperimentalFeature _feature) const { return m_experimentalFeatures.count(_feature); }
+5
View File
@@ -1326,9 +1326,14 @@ void ContractCompiler::appendModifierOrFunctionCode()
if (codeBlock)
{
std::set<ExperimentalFeature> experimentalFeaturesOutside = m_context.experimentalFeaturesActive();
m_context.setExperimentalFeatures(codeBlock->sourceUnit().annotation().experimentalFeatures);
m_returnTags.emplace_back(m_context.newTag(), m_context.stackHeight());
codeBlock->accept(*this);
m_context.setExperimentalFeatures(experimentalFeaturesOutside);
solAssert(!m_returnTags.empty(), "");
m_context << m_returnTags.back().first;
m_returnTags.pop_back();