diff --git a/libsolidity/CMakeLists.txt b/libsolidity/CMakeLists.txt
index fb6fbdcf6..8adf0e04d 100644
--- a/libsolidity/CMakeLists.txt
+++ b/libsolidity/CMakeLists.txt
@@ -46,16 +46,6 @@ set(sources
analysis/TypeChecker.h
analysis/ViewPureChecker.cpp
analysis/ViewPureChecker.h
- analysis/experimental/Analysis.cpp
- analysis/experimental/Analysis.h
- analysis/experimental/DebugWarner.cpp
- analysis/experimental/DebugWarner.h
- analysis/experimental/TypeInference.cpp
- analysis/experimental/TypeInference.h
- analysis/experimental/TypeRegistration.cpp
- analysis/experimental/TypeRegistration.h
- analysis/experimental/SyntaxRestrictor.cpp
- analysis/experimental/SyntaxRestrictor.h
ast/AST.cpp
ast/AST.h
ast/AST_accept.h
@@ -78,12 +68,6 @@ set(sources
ast/Types.h
ast/TypeProvider.cpp
ast/TypeProvider.h
- ast/experimental/Type.cpp
- ast/experimental/Type.h
- ast/experimental/TypeSystem.cpp
- ast/experimental/TypeSystem.h
- ast/experimental/TypeSystemHelper.cpp
- ast/experimental/TypeSystemHelper.h
codegen/ABIFunctions.cpp
codegen/ABIFunctions.h
codegen/ArrayUtils.cpp
@@ -106,13 +90,6 @@ set(sources
codegen/ReturnInfo.cpp
codegen/YulUtilFunctions.h
codegen/YulUtilFunctions.cpp
- codegen/experimental/Common.h
- codegen/experimental/Common.cpp
- codegen/experimental/IRGenerationContext.h
- codegen/experimental/IRGenerator.cpp
- codegen/experimental/IRGenerator.h
- codegen/experimental/IRGeneratorForStatements.cpp
- codegen/experimental/IRGeneratorForStatements.h
codegen/ir/Common.cpp
codegen/ir/Common.h
codegen/ir/IRGenerator.cpp
@@ -205,6 +182,29 @@ set(sources
parsing/Parser.cpp
parsing/Parser.h
parsing/Token.h
+ experimental/analysis/Analysis.cpp
+ experimental/analysis/Analysis.h
+ experimental/analysis/DebugWarner.cpp
+ experimental/analysis/DebugWarner.h
+ experimental/analysis/TypeInference.cpp
+ experimental/analysis/TypeInference.h
+ experimental/analysis/TypeRegistration.cpp
+ experimental/analysis/TypeRegistration.h
+ experimental/analysis/SyntaxRestrictor.cpp
+ experimental/analysis/SyntaxRestrictor.h
+ experimental/ast/Type.cpp
+ experimental/ast/Type.h
+ experimental/ast/TypeSystem.cpp
+ experimental/ast/TypeSystem.h
+ experimental/ast/TypeSystemHelper.cpp
+ experimental/ast/TypeSystemHelper.h
+ experimental/codegen/Common.h
+ experimental/codegen/Common.cpp
+ experimental/codegen/IRGenerationContext.h
+ experimental/codegen/IRGenerator.cpp
+ experimental/codegen/IRGenerator.h
+ experimental/codegen/IRGeneratorForStatements.cpp
+ experimental/codegen/IRGeneratorForStatements.h
)
add_library(solidity ${sources})
diff --git a/libsolidity/analysis/experimental/Analysis.cpp b/libsolidity/experimental/analysis/Analysis.cpp
similarity index 94%
rename from libsolidity/analysis/experimental/Analysis.cpp
rename to libsolidity/experimental/analysis/Analysis.cpp
index 4a1aa2f47..3e1b7d59d 100644
--- a/libsolidity/analysis/experimental/Analysis.cpp
+++ b/libsolidity/experimental/analysis/Analysis.cpp
@@ -15,12 +15,12 @@
along with solidity. If not, see .
*/
// SPDX-License-Identifier: GPL-3.0
-#include
+#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
using namespace std;
using namespace solidity::langutil;
diff --git a/libsolidity/analysis/experimental/Analysis.h b/libsolidity/experimental/analysis/Analysis.h
similarity index 98%
rename from libsolidity/analysis/experimental/Analysis.h
rename to libsolidity/experimental/analysis/Analysis.h
index af6cef12c..0d7298dc6 100644
--- a/libsolidity/analysis/experimental/Analysis.h
+++ b/libsolidity/experimental/analysis/Analysis.h
@@ -17,7 +17,7 @@
// SPDX-License-Identifier: GPL-3.0
#pragma once
-#include
+#include
#include
#include
diff --git a/libsolidity/analysis/experimental/DebugWarner.cpp b/libsolidity/experimental/analysis/DebugWarner.cpp
similarity index 88%
rename from libsolidity/analysis/experimental/DebugWarner.cpp
rename to libsolidity/experimental/analysis/DebugWarner.cpp
index e12445eb3..cf65d8da8 100644
--- a/libsolidity/analysis/experimental/DebugWarner.cpp
+++ b/libsolidity/experimental/analysis/DebugWarner.cpp
@@ -16,11 +16,11 @@
*/
// SPDX-License-Identifier: GPL-3.0
-#include
+#include
-#include
-#include
-#include
+#include
+#include
+#include
#include
diff --git a/libsolidity/analysis/experimental/DebugWarner.h b/libsolidity/experimental/analysis/DebugWarner.h
similarity index 100%
rename from libsolidity/analysis/experimental/DebugWarner.h
rename to libsolidity/experimental/analysis/DebugWarner.h
diff --git a/libsolidity/analysis/experimental/SyntaxRestrictor.cpp b/libsolidity/experimental/analysis/SyntaxRestrictor.cpp
similarity index 97%
rename from libsolidity/analysis/experimental/SyntaxRestrictor.cpp
rename to libsolidity/experimental/analysis/SyntaxRestrictor.cpp
index 690216fe3..85c8b8a48 100644
--- a/libsolidity/analysis/experimental/SyntaxRestrictor.cpp
+++ b/libsolidity/experimental/analysis/SyntaxRestrictor.cpp
@@ -16,9 +16,9 @@
*/
// SPDX-License-Identifier: GPL-3.0
-#include
+#include
-#include
+#include
#include
diff --git a/libsolidity/analysis/experimental/SyntaxRestrictor.h b/libsolidity/experimental/analysis/SyntaxRestrictor.h
similarity index 100%
rename from libsolidity/analysis/experimental/SyntaxRestrictor.h
rename to libsolidity/experimental/analysis/SyntaxRestrictor.h
diff --git a/libsolidity/analysis/experimental/TypeInference.cpp b/libsolidity/experimental/analysis/TypeInference.cpp
similarity index 98%
rename from libsolidity/analysis/experimental/TypeInference.cpp
rename to libsolidity/experimental/analysis/TypeInference.cpp
index 2fc250d2e..2738a4f98 100644
--- a/libsolidity/analysis/experimental/TypeInference.cpp
+++ b/libsolidity/experimental/analysis/TypeInference.cpp
@@ -17,10 +17,10 @@
// SPDX-License-Identifier: GPL-3.0
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
#include
#include
@@ -301,6 +301,12 @@ bool TypeInference::visit(BinaryOperation const& _binaryOperation)
_binaryOperation.rightExpression().accept(*this);
operationAnnotation.type = helper.functionType(getType(_binaryOperation.leftExpression()), getType(_binaryOperation.rightExpression()));
}
+ else if (_binaryOperation.getOperator() == Token::BitOr)
+ {
+ _binaryOperation.leftExpression().accept(*this);
+ _binaryOperation.rightExpression().accept(*this);
+ operationAnnotation.type = helper.sumType({getType(_binaryOperation.leftExpression()), getType(_binaryOperation.rightExpression())});
+ }
else
{
m_errorReporter.typeError(0000_error, _binaryOperation.location(), "Invalid binary operations in type context.");
diff --git a/libsolidity/analysis/experimental/TypeInference.h b/libsolidity/experimental/analysis/TypeInference.h
similarity index 98%
rename from libsolidity/analysis/experimental/TypeInference.h
rename to libsolidity/experimental/analysis/TypeInference.h
index 7f40c8664..6af6b09a3 100644
--- a/libsolidity/analysis/experimental/TypeInference.h
+++ b/libsolidity/experimental/analysis/TypeInference.h
@@ -18,7 +18,7 @@
#pragma once
#include
-#include
+#include
#include
diff --git a/libsolidity/analysis/experimental/TypeRegistration.cpp b/libsolidity/experimental/analysis/TypeRegistration.cpp
similarity index 97%
rename from libsolidity/analysis/experimental/TypeRegistration.cpp
rename to libsolidity/experimental/analysis/TypeRegistration.cpp
index ca2a1ea7c..281bf4a0e 100644
--- a/libsolidity/analysis/experimental/TypeRegistration.cpp
+++ b/libsolidity/experimental/analysis/TypeRegistration.cpp
@@ -17,9 +17,9 @@
// SPDX-License-Identifier: GPL-3.0
-#include
-#include
-#include
+#include
+#include
+#include
#include
#include
diff --git a/libsolidity/analysis/experimental/TypeRegistration.h b/libsolidity/experimental/analysis/TypeRegistration.h
similarity index 97%
rename from libsolidity/analysis/experimental/TypeRegistration.h
rename to libsolidity/experimental/analysis/TypeRegistration.h
index 4cf7e0531..63c4ce8bf 100644
--- a/libsolidity/analysis/experimental/TypeRegistration.h
+++ b/libsolidity/experimental/analysis/TypeRegistration.h
@@ -18,7 +18,7 @@
#pragma once
#include
-#include
+#include
#include
diff --git a/libsolidity/ast/experimental/Type.cpp b/libsolidity/experimental/ast/Type.cpp
similarity index 97%
rename from libsolidity/ast/experimental/Type.cpp
rename to libsolidity/experimental/ast/Type.cpp
index 9a50ff911..9650a6411 100644
--- a/libsolidity/ast/experimental/Type.cpp
+++ b/libsolidity/experimental/ast/Type.cpp
@@ -16,7 +16,7 @@
*/
// SPDX-License-Identifier: GPL-3.0
-#include
+#include
#include
#include
diff --git a/libsolidity/ast/experimental/Type.h b/libsolidity/experimental/ast/Type.h
similarity index 99%
rename from libsolidity/ast/experimental/Type.h
rename to libsolidity/experimental/ast/Type.h
index c28e748c8..f3c6b91c6 100644
--- a/libsolidity/ast/experimental/Type.h
+++ b/libsolidity/experimental/ast/Type.h
@@ -38,6 +38,7 @@ enum class PrimitiveType
TypeFunction,
Unit,
Pair,
+ Sum,
Word,
Bool,
Integer
diff --git a/libsolidity/ast/experimental/TypeSystem.cpp b/libsolidity/experimental/ast/TypeSystem.cpp
similarity index 98%
rename from libsolidity/ast/experimental/TypeSystem.cpp
rename to libsolidity/experimental/ast/TypeSystem.cpp
index ddcc7337b..95405b25f 100644
--- a/libsolidity/ast/experimental/TypeSystem.cpp
+++ b/libsolidity/experimental/ast/TypeSystem.cpp
@@ -17,8 +17,8 @@
// SPDX-License-Identifier: GPL-3.0
-#include
-#include
+#include
+#include
#include
#include
@@ -141,6 +141,7 @@ TypeSystem::TypeSystem()
{PrimitiveType::Void, "void", 0},
{PrimitiveType::Unit, "unit", 0},
{PrimitiveType::Pair, "pair", 2},
+ {PrimitiveType::Sum, "sum", 2},
{PrimitiveType::Word, "word", 0},
{PrimitiveType::Integer, "integer", 0},
{PrimitiveType::Bool, "bool", 0},
diff --git a/libsolidity/ast/experimental/TypeSystem.h b/libsolidity/experimental/ast/TypeSystem.h
similarity index 99%
rename from libsolidity/ast/experimental/TypeSystem.h
rename to libsolidity/experimental/ast/TypeSystem.h
index 24dd98bf4..f1bf12887 100644
--- a/libsolidity/ast/experimental/TypeSystem.h
+++ b/libsolidity/experimental/ast/TypeSystem.h
@@ -17,7 +17,7 @@
// SPDX-License-Identifier: GPL-3.0
#pragma once
-#include
+#include
#include
#include
diff --git a/libsolidity/ast/experimental/TypeSystemHelper.cpp b/libsolidity/experimental/ast/TypeSystemHelper.cpp
similarity index 88%
rename from libsolidity/ast/experimental/TypeSystemHelper.cpp
rename to libsolidity/experimental/ast/TypeSystemHelper.cpp
index 75095a709..b8d72b85b 100644
--- a/libsolidity/ast/experimental/TypeSystemHelper.cpp
+++ b/libsolidity/experimental/ast/TypeSystemHelper.cpp
@@ -17,11 +17,11 @@
// SPDX-License-Identifier: GPL-3.0
-#include
+#include
#include
-#include
-#include
+#include
+#include
#include
@@ -158,6 +158,48 @@ vector TypeSystemHelpers::destTupleType(Type _tupleType) con
return result;
}
+experimental::Type TypeSystemHelpers::sumType(vector _elements) const
+{
+ if (_elements.empty())
+ return typeSystem.type(PrimitiveType::Void, {});
+ if (_elements.size() == 1)
+ return _elements.front();
+ Type result = _elements.back();
+ for (Type type: _elements | ranges::views::reverse | ranges::views::drop_exactly(1))
+ result = typeSystem.type(PrimitiveType::Sum, {type, result});
+ return result;
+}
+
+vector TypeSystemHelpers::destSumType(Type _tupleType) const
+{
+ if (!isTypeConstant(_tupleType))
+ return {_tupleType};
+ TypeConstructor sumConstructor = typeSystem.constructor(PrimitiveType::Sum);
+ auto [constructor, arguments] = destTypeConstant(_tupleType);
+ if (constructor == typeSystem.constructor(PrimitiveType::Void))
+ return {};
+ if (constructor != sumConstructor)
+ return {_tupleType};
+ solAssert(arguments.size() == 2);
+
+ vector result;
+ result.emplace_back(arguments.front());
+ Type tail = arguments.back();
+ while(true)
+ {
+ if (!isTypeConstant(tail))
+ break;
+ auto [tailConstructor, tailArguments] = destTypeConstant(tail);
+ if (tailConstructor != sumConstructor)
+ break;
+ solAssert(tailArguments.size() == 2);
+ result.emplace_back(tailArguments.front());
+ tail = tailArguments.back();
+ }
+ result.emplace_back(tail);
+ return result;
+}
+
tuple> TypeSystemHelpers::destTypeConstant(Type _type) const
{
using ResultType = tuple>;
diff --git a/libsolidity/ast/experimental/TypeSystemHelper.h b/libsolidity/experimental/ast/TypeSystemHelper.h
similarity index 93%
rename from libsolidity/ast/experimental/TypeSystemHelper.h
rename to libsolidity/experimental/ast/TypeSystemHelper.h
index fd05b5a29..5149d34bd 100644
--- a/libsolidity/ast/experimental/TypeSystemHelper.h
+++ b/libsolidity/experimental/ast/TypeSystemHelper.h
@@ -17,7 +17,7 @@
// SPDX-License-Identifier: GPL-3.0
#pragma once
-#include
+#include
#include
#include
@@ -37,6 +37,8 @@ struct TypeSystemHelpers
bool isTypeConstant(Type _type) const;
Type tupleType(std::vector _elements) const;
std::vector destTupleType(Type _tupleType) const;
+ Type sumType(std::vector _elements) const;
+ std::vector destSumType(Type _tupleType) const;
Type functionType(Type _argType, Type _resultType) const;
std::tuple destFunctionType(Type _functionType) const;
bool isFunctionType(Type _type) const;
diff --git a/libsolidity/codegen/experimental/Common.cpp b/libsolidity/experimental/codegen/Common.cpp
similarity index 92%
rename from libsolidity/codegen/experimental/Common.cpp
rename to libsolidity/experimental/codegen/Common.cpp
index 0e655696e..b14c51c67 100644
--- a/libsolidity/codegen/experimental/Common.cpp
+++ b/libsolidity/experimental/codegen/Common.cpp
@@ -16,9 +16,9 @@
*/
// SPDX-License-Identifier: GPL-3.0
-#include
-#include
-#include
+#include
+#include
+#include
#include
diff --git a/libsolidity/codegen/experimental/Common.h b/libsolidity/experimental/codegen/Common.h
similarity index 96%
rename from libsolidity/codegen/experimental/Common.h
rename to libsolidity/experimental/codegen/Common.h
index ad7c1cdf0..25f05efcb 100644
--- a/libsolidity/codegen/experimental/Common.h
+++ b/libsolidity/experimental/codegen/Common.h
@@ -19,7 +19,7 @@
#pragma once
#include
-#include
+#include
#include
#include
diff --git a/libsolidity/codegen/experimental/IRGenerationContext.h b/libsolidity/experimental/codegen/IRGenerationContext.h
similarity index 93%
rename from libsolidity/codegen/experimental/IRGenerationContext.h
rename to libsolidity/experimental/codegen/IRGenerationContext.h
index ff01a5d8e..b0958cf67 100644
--- a/libsolidity/codegen/experimental/IRGenerationContext.h
+++ b/libsolidity/experimental/codegen/IRGenerationContext.h
@@ -20,8 +20,8 @@
#include
-#include
-#include
+#include
+#include
#include
#include
diff --git a/libsolidity/codegen/experimental/IRGenerator.cpp b/libsolidity/experimental/codegen/IRGenerator.cpp
similarity index 91%
rename from libsolidity/codegen/experimental/IRGenerator.cpp
rename to libsolidity/experimental/codegen/IRGenerator.cpp
index 73fd0468d..4b02592e4 100644
--- a/libsolidity/codegen/experimental/IRGenerator.cpp
+++ b/libsolidity/experimental/codegen/IRGenerator.cpp
@@ -16,16 +16,16 @@
*/
// SPDX-License-Identifier: GPL-3.0
-#include
-#include
-#include
+#include
+#include
+#include
-#include
+#include
-#include
-#include
+#include
+#include
-#include
+#include
#include
#include
diff --git a/libsolidity/codegen/experimental/IRGenerator.h b/libsolidity/experimental/codegen/IRGenerator.h
similarity index 94%
rename from libsolidity/codegen/experimental/IRGenerator.h
rename to libsolidity/experimental/codegen/IRGenerator.h
index 125d06bf0..cce8c7305 100644
--- a/libsolidity/codegen/experimental/IRGenerator.h
+++ b/libsolidity/experimental/codegen/IRGenerator.h
@@ -18,12 +18,12 @@
#pragma once
-#include
+#include
#include
#include
#include
#include
-#include
+#include
#include
#include
diff --git a/libsolidity/codegen/experimental/IRGeneratorForStatements.cpp b/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp
similarity index 97%
rename from libsolidity/codegen/experimental/IRGeneratorForStatements.cpp
rename to libsolidity/experimental/codegen/IRGeneratorForStatements.cpp
index b39fe712e..b4bbdcdfd 100644
--- a/libsolidity/codegen/experimental/IRGeneratorForStatements.cpp
+++ b/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp
@@ -16,20 +16,20 @@
*/
// SPDX-License-Identifier: GPL-3.0
-#include
+#include
-#include
-#include
-#include
+#include
+#include
+#include
-#include
+#include
#include
#include
#include
#include
-#include
+#include
#include
diff --git a/libsolidity/codegen/experimental/IRGeneratorForStatements.h b/libsolidity/experimental/codegen/IRGeneratorForStatements.h
similarity index 97%
rename from libsolidity/codegen/experimental/IRGeneratorForStatements.h
rename to libsolidity/experimental/codegen/IRGeneratorForStatements.h
index e375899e4..6b3f51c1c 100644
--- a/libsolidity/codegen/experimental/IRGeneratorForStatements.h
+++ b/libsolidity/experimental/codegen/IRGeneratorForStatements.h
@@ -18,7 +18,7 @@
#pragma once
-#include
+#include
#include
#include
diff --git a/libsolidity/codegen/experimental/IRVariable.cpp b/libsolidity/experimental/codegen/IRVariable.cpp
similarity index 92%
rename from libsolidity/codegen/experimental/IRVariable.cpp
rename to libsolidity/experimental/codegen/IRVariable.cpp
index ae5a52743..3f2c6f648 100644
--- a/libsolidity/codegen/experimental/IRVariable.cpp
+++ b/libsolidity/experimental/codegen/IRVariable.cpp
@@ -15,11 +15,11 @@
along with solidity. If not, see .
*/
// SPDX-License-Identifier: GPL-3.0
-#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
+#include
#include
#include
diff --git a/libsolidity/codegen/experimental/IRVariable.h b/libsolidity/experimental/codegen/IRVariable.h
similarity index 98%
rename from libsolidity/codegen/experimental/IRVariable.h
rename to libsolidity/experimental/codegen/IRVariable.h
index dec77a581..02d6f7931 100644
--- a/libsolidity/codegen/experimental/IRVariable.h
+++ b/libsolidity/experimental/codegen/IRVariable.h
@@ -17,7 +17,7 @@
// SPDX-License-Identifier: GPL-3.0
#pragma once
-#include
+#include
#include
#include
diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp
index 739430490..6d0c9724c 100644
--- a/libsolidity/interface/CompilerStack.cpp
+++ b/libsolidity/interface/CompilerStack.cpp
@@ -44,7 +44,6 @@
#include
#include
-#include
#include
#include
@@ -58,7 +57,8 @@
#include
#include
-#include
+#include
+#include
#include
#include