Giter Site home page Giter Site logo

fusionlanguage / fut Goto Github PK

View Code? Open in Web Editor NEW
1.7K 1.7K 49.0 10.31 MB

Fusion programming language. Transpiling to C, C++, C#, D, Java, JavaScript, Python, Swift, TypeScript and OpenCL C.

Home Page: https://fusion-lang.org

License: GNU General Public License v3.0

C# 30.70% Makefile 0.49% C++ 37.60% Java 0.40% JavaScript 30.46% Perl 0.01% TypeScript 0.34%
language programming-language transpiler

fut's People

Contributors

caesay avatar chuvi-w avatar epi avatar jedwards1211 avatar marco012 avatar pfusik avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fut's Issues

Fusion to Pascal?

Hi guys!
Any plans for Ć to Pascal?
How about C/C++/JS/C# to Ć?

NullReferenceException when trying to default-initialize array argument

The following code saved to x.ci:

public static class Test
{
    public static void Run(int[]# arr = new int[10]) {
    }
}

produces the following error when running cito x.ci -o x.py compiled from 5e518d3:

Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenBase.Visit(CiPrefixExpr expr, CiPriority parent) in F:\cito\GenBase.cs:line 840
   at Foxoft.Ci.GenPySwift.Visit(CiPrefixExpr expr, CiPriority parent) in F:\cito\GenPySwift.cs:line 112
   at Foxoft.Ci.GenPy.Visit(CiPrefixExpr expr, CiPriority parent) in F:\cito\GenPy.cs:line 254
   at Foxoft.Ci.CiPrefixExpr.Accept(CiVisitor visitor, CiPriority parent) in F:\cito\CiTree.cs:line 435
   at Foxoft.Ci.GenBase.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in F:\cito\GenBase.cs:line 612
   at Foxoft.Ci.GenBase.WriteCoerced(CiType type, CiExpr expr, CiPriority parent) in F:\cito\GenBase.cs:line 633
   at Foxoft.Ci.GenBase.WriteCoercedExpr(CiType type, CiExpr expr) in F:\cito\GenBase.cs:line 754
   at Foxoft.Ci.GenBase.WriteVarInit(CiNamedValue def) in F:\cito\GenBase.cs:line 765
   at Foxoft.Ci.GenBase.WriteParameters(CiMethod method, Boolean first, Boolean defaultArguments) in F:\cito\GenBase.cs:line 1340
   at Foxoft.Ci.GenPy.Write(CiMethod method) in F:\cito\GenPy.cs:line 1075
   at Foxoft.Ci.GenPy.Write(CiClass klass) in F:\cito\GenPy.cs:line 1118
   at Foxoft.Ci.GenPy.Write(CiProgram program) in F:\cito\GenPy.cs:line 1158
   at Foxoft.Ci.CiTo.Main(String[] args) in F:\cito\CiTo.cs:line 155

Context: I was trying to see how Python's mutable default arguments are handled.

Extracting helper functions in generators

I was looking into implementing Regex.Escape for JS/TS. Even though it's pretty simple (string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')) I think it would be better to write a regexEscape helper function at the top of the file and then call it.

I haven't noticed evidence that GenJs currently does this for anything else...I think a generic mechanism to extract helper functions would be useful in a lot of situations.

This would make the rest of the translation simple to write:

Write(regexEscapeMethodName + '(');
pattern.Accept(this, CiPriority.Statement);
Write(')');

The main challenges would be

  • Extracting a function needs to automatically add something to the function name if it would conflict with the user's own identifiers
  • Since generation relies on sequential Write calls there's not currently a way to go back and insert something at the top of the output

What do you think? If nothing else we could run all the code through a visitor to decide what to extract before writing anything.

Recursive pattern in NET8

In file CiREsolver.cs:985 is

CiMethod method = symbol.Symbol switch {
	CiMethod m => m,
	CiMethodGroup group => group.Methods.FirstOrDefault(m => CanCall(m, arguments))
		?? /* pick first for the error message */ group.Methods[0],
	_ => throw StatementException(symbol, "Expected a method")
};

I am trying compile if with mono in Linux in version NET 7.3 without this "recursive pattern" feature. How can I downgrade this piece of code?
Here is for my odd switch - value symbol.Symbol is not compared to known values but to definitions different types (?)

In usual switch form this will?

CiMethod method;
switch (symbol.Symbol)  {
	case (CiMethod m): //<-------------here error
		method = m;
		break;
	case (CiMethodGroup group): //<-------------here error
		method = group.Methods.FirstOrDefault(m => CanCall(m, arguments))
				       ?? /* pick first for the error message */ group.Methods[0];
		break;
	default: throw StatementException(symbol, "Expected a method");
};

Finally, this will (?)

CiMethod method;
if (symbol.Symbol is CiMethod)
	method = (CiMethod) symbol.Symbol;
else if (symbol.Symbol is CiMethodGroup)
	method = (symbol.Symbol as CiMethodGroup).Methods.FirstOrDefault(m => CanCall(m, arguments))
			       ?? /* pick first for the error message */ (symbol.Symbol as CiMethodGroup).Methods[0];
else throw StatementException(symbol, "Expected a method");

Null safety syntax

Hi!
Any plans to support null safety?

I get, that default syntax implies nullable variable as in C#, but it would be nice to have a syntax for non-nullable variable type if applicable.
Many languages natively support it and others support it through an interface. Worst case scenario, they can be translated to normal nullables if there is no implementation or implementation would be too complicated (for example typescript supports it, but when ran as javascript, every variable is in reality nullable anyway).

Having code nice for all platforms loses a lot of it's charm without null safety :-)

Variables/fields are not initialized in C and C++

Consider the following example:

public class Foo {
    int x;
}
public static class Example {
    public static void Run() {
        int x;
        Console.WriteLine(x);

        Foo() f;
        Console.WriteLine(f.x);
    }
}

it gets compiled to the following C code (comments mine):

struct Foo {
	int x;
};

void Example_Run(void)
{
	int x;
	printf("%d\n", x);
	Foo f;
	printf("%d\n", f.x);
}

and the following C++ code:

class Foo
{
public:
	Foo() = default;
private:
	int x;
};
// ...
void Example::run()
{
	int x;
	std::cout << x << '\n';
	Foo f;
	std::cout << f.x << '\n';
}

Here, int x; the variable and int x; the field are default-initialized. In other words, they are uninitialized and any reading from them invokes undefined behavior immediately. Consequences may be dire.

AFAIK, in Java variable of fundamental types are initialized to zero. So, the fix for C++ is easy: initialize all variables in fields to zero, you can use C++11's default member initializer just like in Java.

In C there are no constructors or default initialization, so you have to initialize it manually or emulate a constructor yourself.

Printing concatenated results

Are there any plans for more general concatenation support when going to languages without proper support like c?
This came up while trying Console.Write as Console.Write(int + string) gives fputs(int + string, stdout) and so relies on c to handle it which of course it won't do. This doesn't happen when the int and string are printed separately as Console.Write(int) will correctly give printf("%d", int). Is printing different types separately just the intended way or is this a bug?

Provided this is reasonable to fix, printf(%d%s, int, string) should work fine and generalise to other combinations but I haven't checked what the support for format strings is like since most of the supported languages don't even have them.

Test Failures mac OS X

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.5
BuildVersion:	19F101

$ make test
dotnet build
Microsoft (R) Build Engine version 16.7.0-preview-20360-03+188921e2f for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  cito -> /Users/coke/sandbox/cito/bin/Debug/netcoreapp3.1/cito.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.62
test/bin/ArrayCopyTo/Test.c
test/bin/ArrayCopyTo/c.exe
test/bin/ArrayCopyTo/c.txt
test/bin/ArrayFill/Test.c
test/bin/ArrayFill/c.exe
test/bin/ArrayFill/c.txt
test/bin/ArrayLength/Test.c
test/bin/ArrayLength/c.exe
test/bin/ArrayLength/c.txt
test/bin/ArrayPtrMultiDim/Test.c
test/bin/ArrayPtrMultiDim/c.exe
test/bin/ArrayPtrMultiDim/c.txt
test/bin/ArrayStgInit/Test.c
test/bin/ArrayStgInit/c.exe
test/bin/ArrayStgInit/c.txt
test/bin/ArrayStgInitField/Test.c
test/bin/ArrayStgInitField/c.exe
test/bin/ArrayStgInitField/c.txt
test/bin/ArrayStgMultiDim/Test.c
test/bin/ArrayStgMultiDim/c.exe
test/bin/ArrayStgMultiDim/c.txt
test/bin/ArrayStgObjectStg/Test.c
test/bin/ArrayStgObjectStg/c.exe
test/bin/ArrayStgObjectStg/c.txt
test/bin/ArrayStgStringStg/Test.c
test/bin/ArrayStgStringStg/c.exe
test/bin/ArrayStgStringStg/c.txt
test/bin/Basic/Test.c
test/bin/Basic/c.exe
test/bin/Basic/c.txt
test/bin/ByteArray/Test.c
test/bin/ByteArray/c.exe
test/bin/ByteArray/c.txt
test/bin/ClassForwardBase/Test.c
test/bin/ClassForwardBase/c.exe
test/bin/ClassForwardBase/c.txt
test/bin/ClassForwardPtr/Test.c
test/bin/ClassForwardPtr/c.exe
test/bin/ClassForwardPtr/c.txt
test/bin/ClassForwardStg/Test.c
test/bin/ClassForwardStg/c.exe
test/bin/ClassForwardStg/c.txt
test/bin/CollectionPtrCycle/Test.c
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenC.WriteName(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 174
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 726
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
	List<Test>() ListStg; //FAIL: c cl
test/bin/CollectionPtrCycle/c.exe
clang: error: no such file or directory: 'test/bin/CollectionPtrCycle/Test.c'
	List<Test>() ListStg; //FAIL: c cl
test/bin/CollectionPtrCycle/c.txt
/bin/sh: ./test/bin/CollectionPtrCycle/c.exe: No such file or directory
	List<Test>() ListStg; //FAIL: c cl
test/bin/ConstArrayInt/Test.c
test/bin/ConstArrayInt/c.exe
test/bin/ConstArrayInt/c.txt
test/bin/ConstArrayNoLen/Test.c
test/bin/ConstArrayNoLen/c.exe
test/bin/ConstArrayNoLen/c.txt
test/bin/ConstBool/Test.c
test/bin/ConstBool/c.exe
test/bin/ConstBool/c.txt
test/bin/ConstByteArray/Test.c
test/bin/ConstByteArray/c.exe
test/bin/ConstByteArray/c.txt
test/bin/ConstDouble/Test.c
test/bin/ConstDouble/c.exe
test/bin/ConstDouble/c.txt
test/bin/ConstEnum/Test.c
test/bin/ConstEnum/c.exe
test/bin/ConstEnum/c.txt
test/bin/ConstInt/Test.c
test/bin/ConstInt/c.exe
test/bin/ConstInt/c.txt
test/bin/ConstLocalMany/Test.c
test/bin/ConstLocalMany/c.exe
test/bin/ConstLocalMany/c.txt
test/bin/ConstLong/Test.c
test/bin/ConstLong/c.exe
test/bin/ConstLong/c.txt
			&& i * Bar == Foo; //FAIL: c cpp cs java
test/bin/ConstString/Test.c
test/bin/ConstString/c.exe
test/bin/ConstString/c.txt
test/bin/ConstStringInterpolated/Test.c
test/bin/ConstStringInterpolated/c.exe
test/bin/ConstStringInterpolated/c.txt
test/bin/Doc/Test.c
test/bin/Doc/c.exe
test/bin/Doc/c.txt
test/bin/DynamicArrayMultiDim/Test.c
test/bin/DynamicArrayMultiDim/c.exe
test/bin/DynamicArrayMultiDim/c.txt
test/bin/DynamicAssign/Test.c
test/bin/DynamicAssign/c.exe
test/bin/DynamicAssign/c.txt
test/bin/DynamicByteArray/Test.c
test/bin/DynamicByteArray/c.exe
test/bin/DynamicByteArray/c.txt
test/bin/DynamicInit/Test.c
test/bin/DynamicInit/c.exe
test/bin/DynamicInit/c.txt
test/bin/DynamicPtrArray/Test.c
test/bin/DynamicPtrArray/c.exe
test/bin/DynamicPtrArray/c.txt
test/bin/DynamicReset/Test.c
test/bin/DynamicReset/c.exe
test/bin/DynamicReset/c.txt
test/bin/EncodingGetString/Test.c
test/bin/EncodingGetString/c.exe
test/bin/EncodingGetString/c.txt
test/bin/Enum/Test.c
test/bin/Enum/c.exe
test/bin/Enum/c.txt
test/bin/EnumFlags/Test.c
test/bin/EnumFlags/c.exe
test/bin/EnumFlags/c.txt
test/bin/EnumValue/Test.c
test/bin/EnumValue/c.exe
test/bin/EnumValue/c.txt
test/bin/Float/Test.c
test/bin/Float/c.exe
test/bin/Float/c.txt
test/bin/FloatToInt/Test.c
test/bin/FloatToInt/c.exe
test/bin/FloatToInt/c.txt
test/bin/IntUnsigned/Test.c
test/bin/IntUnsigned/c.exe
test/bin/IntUnsigned/c.txt
test/bin/Keyword/Test.c
test/bin/Keyword/c.exe
test/bin/Keyword/c.txt
test/bin/LexCommentMultiLine/Test.c
test/bin/LexCommentMultiLine/c.exe
test/bin/LexCommentMultiLine/c.txt
test/bin/LexCommentSingleLine/Test.c
test/bin/LexCommentSingleLine/c.exe
test/bin/LexCommentSingleLine/c.txt
test/bin/LexGolf/Test.c
test/bin/LexGolf/c.exe
test/bin/LexGolf/c.txt
test/bin/LexLiteralChar/Test.c
test/bin/LexLiteralChar/c.exe
test/bin/LexLiteralChar/c.txt
test/bin/LexLiteralDouble/Test.c
test/bin/LexLiteralDouble/c.exe
test/bin/LexLiteralDouble/c.txt
test/bin/LexLiteralHex/Test.c
test/bin/LexLiteralHex/c.exe
test/bin/LexLiteralHex/c.txt
test/bin/LibConsoleErrorWrite/Test.c
test/bin/LibConsoleErrorWrite/c.exe
test/bin/LibConsoleErrorWrite/c.txt
Helloi=2Atest/bin/LibConsoleErrorWriteLine/Test.c
test/bin/LibConsoleErrorWriteLine/c.exe
test/bin/LibConsoleErrorWriteLine/c.txt
Hello
i=2A
test/bin/LibConsoleWrite/Test.c
test/bin/LibConsoleWrite/c.exe
test/bin/LibConsoleWrite/c.txt
test/bin/LibConsoleWriteLine/Test.c
test/bin/LibConsoleWriteLine/c.exe
test/bin/LibConsoleWriteLine/c.txt
test/bin/LibDictionary/Test.c
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenC.WriteName(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 174
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 726
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		Dictionary<int, int>() dict; //FAIL: c cl
test/bin/LibDictionary/c.exe
clang: error: no such file or directory: 'test/bin/LibDictionary/Test.c'
		Dictionary<int, int>() dict; //FAIL: c cl
test/bin/LibDictionary/c.txt
/bin/sh: ./test/bin/LibDictionary/c.exe: No such file or directory
		Dictionary<int, int>() dict; //FAIL: c cl
test/bin/LibDictionaryObjectStg/Test.c
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenC.WriteName(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 174
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 726
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		Dictionary<int, Test()>() dict; //FAIL: c cl
test/bin/LibDictionaryObjectStg/c.exe
clang: error: no such file or directory: 'test/bin/LibDictionaryObjectStg/Test.c'
		Dictionary<int, Test()>() dict; //FAIL: c cl
test/bin/LibDictionaryObjectStg/c.txt
/bin/sh: ./test/bin/LibDictionaryObjectStg/c.exe: No such file or directory
		Dictionary<int, Test()>() dict; //FAIL: c cl
test/bin/LibDictionaryPtr/Test.c
Unhandled exception. System.InvalidCastException: Unable to cast object of type 'Foxoft.Ci.CiDictionaryType' to type 'Foxoft.Ci.CiClassPtrType'.
   at Foxoft.Ci.GenC.WriteMemberAccess(CiExpr left, CiClass symbolClass) in /Users/coke/sandbox/cito/GenC.cs:line 534
   at Foxoft.Ci.GenC.WriteMemberOp(CiExpr left, CiSymbolReference symbol) in /Users/coke/sandbox/cito/GenC.cs:line 542
   at Foxoft.Ci.GenBase.Visit(CiSymbolReference expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 594
   at Foxoft.Ci.GenCCpp.Visit(CiSymbolReference expr, CiPriority parent) in /Users/coke/sandbox/cito/GenCCpp.cs:line 83
   at Foxoft.Ci.GenC.Visit(CiSymbolReference expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 229
   at Foxoft.Ci.CiSymbolReference.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 416
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, CiPriority parent, CiPriority child, String op) in /Users/coke/sandbox/cito/GenBase.cs:line 864
   at Foxoft.Ci.GenBase.WriteComparison(CiBinaryExpr expr, CiPriority parent, CiPriority child, String op) in /Users/coke/sandbox/cito/GenBase.cs:line 869
   at Foxoft.Ci.GenTyped.WriteComparison(CiBinaryExpr expr, CiPriority parent, CiPriority child, String op) in /Users/coke/sandbox/cito/GenTyped.cs:line 115
   at Foxoft.Ci.GenBase.WriteEqual(CiBinaryExpr expr, CiPriority parent, Boolean not) in /Users/coke/sandbox/cito/GenBase.cs:line 874
   at Foxoft.Ci.GenCCpp.WriteEqual(CiBinaryExpr expr, CiPriority parent, Boolean not) in /Users/coke/sandbox/cito/GenCCpp.cs:line 107
   at Foxoft.Ci.GenC.WriteEqual(CiBinaryExpr expr, CiPriority parent, Boolean not) in /Users/coke/sandbox/cito/GenC.cs:line 624
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 988
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 602
   at Foxoft.Ci.GenTyped.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenTyped.cs:line 249
   at Foxoft.Ci.GenC.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 589
   at Foxoft.Ci.GenBase.WriteCoerced(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 623
   at Foxoft.Ci.GenBase.Visit(CiReturn statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1162
   at Foxoft.Ci.GenC.Visit(CiReturn statement) in /Users/coke/sandbox/cito/GenC.cs:line 1152
   at Foxoft.Ci.CiReturn.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 668
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		Dictionary<int, string>() sd; //FAIL: c cl
test/bin/LibDictionaryPtr/c.exe
clang: error: no such file or directory: 'test/bin/LibDictionaryPtr/Test.c'
		Dictionary<int, string>() sd; //FAIL: c cl
test/bin/LibDictionaryPtr/c.txt
/bin/sh: ./test/bin/LibDictionaryPtr/c.exe: No such file or directory
		Dictionary<int, string>() sd; //FAIL: c cl
test/bin/LibList/Test.c
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenC.WriteName(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 174
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 726
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		List<int>() list; //FAIL: c cl
test/bin/LibList/c.exe
clang: error: no such file or directory: 'test/bin/LibList/Test.c'
		List<int>() list; //FAIL: c cl
test/bin/LibList/c.txt
/bin/sh: ./test/bin/LibList/c.exe: No such file or directory
		List<int>() list; //FAIL: c cl
test/bin/LibListArrayStg/Test.c
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenC.WriteName(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 174
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 726
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 602
   at Foxoft.Ci.GenTyped.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenTyped.cs:line 249
   at Foxoft.Ci.GenC.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 589
   at Foxoft.Ci.GenBase.WriteCoerced(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 623
   at Foxoft.Ci.GenBase.WriteCoercedExpr(CiType type, CiExpr expr) in /Users/coke/sandbox/cito/GenBase.cs:line 692
   at Foxoft.Ci.GenBase.WriteVarInit(CiNamedValue def) in /Users/coke/sandbox/cito/GenBase.cs:line 711
   at Foxoft.Ci.GenCCpp.WriteVarInit(CiNamedValue def) in /Users/coke/sandbox/cito/GenCCpp.cs:line 91
   at Foxoft.Ci.GenC.WriteVarInit(CiNamedValue def) in /Users/coke/sandbox/cito/GenC.cs:line 461
   at Foxoft.Ci.GenBase.WriteVar(CiNamedValue def) in /Users/coke/sandbox/cito/GenBase.cs:line 718
   at Foxoft.Ci.GenC.WriteVar(CiNamedValue def) in /Users/coke/sandbox/cito/GenC.cs:line 476
   at Foxoft.Ci.GenBase.Visit(CiVar expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 723
   at Foxoft.Ci.CiVar.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 277
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		List<int[2]>() list; //FAIL: c cl
test/bin/LibListArrayStg/c.exe
clang: error: no such file or directory: 'test/bin/LibListArrayStg/Test.c'
		List<int[2]>() list; //FAIL: c cl
test/bin/LibListArrayStg/c.txt
/bin/sh: ./test/bin/LibListArrayStg/c.exe: No such file or directory
		List<int[2]>() list; //FAIL: c cl
test/bin/LibListByte/Test.c
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenC.WriteName(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 174
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 726
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		List<byte>() list; //FAIL: c cl
test/bin/LibListByte/c.exe
clang: error: no such file or directory: 'test/bin/LibListByte/Test.c'
		List<byte>() list; //FAIL: c cl
test/bin/LibListByte/c.txt
/bin/sh: ./test/bin/LibListByte/c.exe: No such file or directory
		List<byte>() list; //FAIL: c cl
test/bin/LibListObjectStg/Test.c
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenC.WriteName(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 174
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 726
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenC.WriteClassPtr(CiClass resultClass, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 558
   at Foxoft.Ci.GenC.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 579
   at Foxoft.Ci.GenBase.WriteCoerced(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 623
   at Foxoft.Ci.GenBase.WriteCoercedExpr(CiType type, CiExpr expr) in /Users/coke/sandbox/cito/GenBase.cs:line 692
   at Foxoft.Ci.GenBase.WriteVarInit(CiNamedValue def) in /Users/coke/sandbox/cito/GenBase.cs:line 711
   at Foxoft.Ci.GenCCpp.WriteVarInit(CiNamedValue def) in /Users/coke/sandbox/cito/GenCCpp.cs:line 91
   at Foxoft.Ci.GenC.WriteVarInit(CiNamedValue def) in /Users/coke/sandbox/cito/GenC.cs:line 461
   at Foxoft.Ci.GenBase.WriteVar(CiNamedValue def) in /Users/coke/sandbox/cito/GenBase.cs:line 718
   at Foxoft.Ci.GenC.WriteVar(CiNamedValue def) in /Users/coke/sandbox/cito/GenC.cs:line 476
   at Foxoft.Ci.GenBase.Visit(CiVar expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 723
   at Foxoft.Ci.CiVar.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 277
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		List<Test()>() list; //FAIL: c cl
test/bin/LibListObjectStg/c.exe
clang: error: no such file or directory: 'test/bin/LibListObjectStg/Test.c'
		List<Test()>() list; //FAIL: c cl
test/bin/LibListObjectStg/c.txt
/bin/sh: ./test/bin/LibListObjectStg/c.exe: No such file or directory
		List<Test()>() list; //FAIL: c cl
test/bin/LibMathAcos/Test.c
test/bin/LibMathAcos/c.exe
test/bin/LibMathAcos/c.txt
test/bin/LibMathAsin/Test.c
test/bin/LibMathAsin/c.exe
test/bin/LibMathAsin/c.txt
test/bin/LibMathAtan/Test.c
test/bin/LibMathAtan/c.exe
test/bin/LibMathAtan/c.txt
test/bin/LibMathAtan2/Test.c
test/bin/LibMathAtan2/c.exe
test/bin/LibMathAtan2/c.txt
test/bin/LibMathCbrt/Test.c
test/bin/LibMathCbrt/c.exe
test/bin/LibMathCbrt/c.txt
test/bin/LibMathCeiling/Test.c
test/bin/LibMathCeiling/c.exe
test/bin/LibMathCeiling/c.txt
test/bin/LibMathCos/Test.c
test/bin/LibMathCos/c.exe
test/bin/LibMathCos/c.txt
test/bin/LibMathCosh/Test.c
test/bin/LibMathCosh/c.exe
test/bin/LibMathCosh/c.txt
test/bin/LibMathE/Test.c
test/bin/LibMathE/c.exe
test/bin/LibMathE/c.txt
test/bin/LibMathExp/Test.c
test/bin/LibMathExp/c.exe
test/bin/LibMathExp/c.txt
test/bin/LibMathFloor/Test.c
test/bin/LibMathFloor/c.exe
test/bin/LibMathFloor/c.txt
test/bin/LibMathFusedMultiplyAdd/Test.c
test/bin/LibMathFusedMultiplyAdd/c.exe
test/bin/LibMathFusedMultiplyAdd/c.txt
test/bin/LibMathInfinity/Test.c
test/bin/LibMathInfinity/c.exe
test/bin/LibMathInfinity/c.txt
test/bin/LibMathIsNaN/Test.c
test/bin/LibMathIsNaN/c.exe
test/bin/LibMathIsNaN/c.txt
test/bin/LibMathLog/Test.c
test/bin/LibMathLog/c.exe
test/bin/LibMathLog/c.txt
test/bin/LibMathLog10/Test.c
test/bin/LibMathLog10/c.exe
test/bin/LibMathLog10/c.txt
test/bin/LibMathLog2/Test.c
test/bin/LibMathLog2/c.exe
test/bin/LibMathLog2/c.txt
test/bin/LibMathNaN/Test.c
test/bin/LibMathNaN/c.exe
test/bin/LibMathNaN/c.txt
test/bin/LibMathPI/Test.c
test/bin/LibMathPI/c.exe
test/bin/LibMathPI/c.txt
test/bin/LibMathPow/Test.c
test/bin/LibMathPow/c.exe
test/bin/LibMathPow/c.txt
test/bin/LibMathSin/Test.c
test/bin/LibMathSin/c.exe
test/bin/LibMathSin/c.txt
test/bin/LibMathSinh/Test.c
test/bin/LibMathSinh/c.exe
test/bin/LibMathSinh/c.txt
test/bin/LibMathSqrt/Test.c
test/bin/LibMathSqrt/c.exe
test/bin/LibMathSqrt/c.txt
test/bin/LibMathTan/Test.c
test/bin/LibMathTan/c.exe
test/bin/LibMathTan/c.txt
test/bin/LibMathTanh/Test.c
test/bin/LibMathTanh/c.exe
test/bin/LibMathTanh/c.txt
test/bin/LibMathTruncate/Test.c
test/bin/LibMathTruncate/c.exe
test/bin/LibMathTruncate/c.txt
test/bin/LibSortedDictionary/Test.c
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenC.WriteName(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 174
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 726
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		SortedDictionary<int, int>() dict; //FAIL: c cl
test/bin/LibSortedDictionary/c.exe
clang: error: no such file or directory: 'test/bin/LibSortedDictionary/Test.c'
		SortedDictionary<int, int>() dict; //FAIL: c cl
test/bin/LibSortedDictionary/c.txt
/bin/sh: ./test/bin/LibSortedDictionary/c.exe: No such file or directory
		SortedDictionary<int, int>() dict; //FAIL: c cl
test/bin/LibSortedDictionaryObjectStg/Test.c
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenC.WriteName(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 174
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 726
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		SortedDictionary<int, Test()>() dict; //FAIL: c cl
test/bin/LibSortedDictionaryObjectStg/c.exe
clang: error: no such file or directory: 'test/bin/LibSortedDictionaryObjectStg/Test.c'
		SortedDictionary<int, Test()>() dict; //FAIL: c cl
test/bin/LibSortedDictionaryObjectStg/c.txt
/bin/sh: ./test/bin/LibSortedDictionaryObjectStg/c.exe: No such file or directory
		SortedDictionary<int, Test()>() dict; //FAIL: c cl
test/bin/Long/Test.c
test/bin/Long/c.exe
test/bin/Long/c.txt
test/bin/MethodAbstract/Test.c
test/bin/MethodAbstract/c.exe
test/bin/MethodAbstract/c.txt
test/bin/MethodBase/Test.c
test/bin/MethodBase/c.exe
test/bin/MethodBase/c.txt
test/bin/MethodOverride/Test.c
test/bin/MethodOverride/c.exe
test/bin/MethodOverride/c.txt
test/bin/MethodParamByte/Test.c
test/bin/MethodParamByte/c.exe
test/bin/MethodParamByte/c.txt
test/bin/MethodParamDefault/Test.c
test/bin/MethodParamDefault/c.exe
test/bin/MethodParamDefault/c.txt
test/bin/MethodParamDynamic/Test.c
test/bin/MethodParamDynamic/c.exe
test/bin/MethodParamDynamic/c.txt
test/bin/MethodProtected/Test.c
test/bin/MethodProtected/c.exe
test/bin/MethodProtected/c.txt
test/bin/MethodSealed/Test.c
test/bin/MethodSealed/c.exe
test/bin/MethodSealed/c.txt
test/bin/MethodShort/Test.c
test/bin/MethodShort/c.exe
test/bin/MethodShort/c.txt
test/bin/MethodStatic/Test.c
test/bin/MethodStatic/c.exe
test/bin/MethodStatic/c.txt
test/bin/MethodThis/Test.c
test/bin/MethodThis/c.exe
test/bin/MethodThis/c.txt
test/bin/MethodVirtual/Test.c
test/bin/MethodVirtual/c.exe
test/bin/MethodVirtual/c.txt
test/bin/MethodVirtualThrows/Test.c
test/bin/MethodVirtualThrows/c.exe
test/bin/MethodVirtualThrows/c.txt
test/bin/MethodVoid/Test.c
test/bin/MethodVoid/c.exe
test/bin/MethodVoid/c.txt
test/bin/NativeTopLevel/Test.c
test/bin/NativeTopLevel/c.exe
test/bin/NativeTopLevel/c.txt
test/bin/ObjectConstructor/Test.c
test/bin/ObjectConstructor/c.exe
test/bin/ObjectConstructor/c.txt
test/bin/ObjectConstructorBase/Test.c
test/bin/ObjectConstructorBase/c.exe
test/bin/ObjectConstructorBase/c.txt
test/bin/ObjectConstructorGrand/Test.c
test/bin/ObjectConstructorGrand/c.exe
test/bin/ObjectConstructorGrand/c.txt
test/bin/ObjectFieldArrayStg/Test.c
test/bin/ObjectFieldArrayStg/c.exe
test/bin/ObjectFieldArrayStg/c.txt
test/bin/ObjectFieldInit/Test.c
test/bin/ObjectFieldInit/c.exe
test/bin/ObjectFieldInit/c.txt
test/bin/ObjectFieldProtected/Test.c
test/bin/ObjectFieldProtected/c.exe
test/bin/ObjectFieldProtected/c.txt
test/bin/ObjectPtrCycle/Test.c
test/bin/ObjectPtrCycle/c.exe
test/bin/ObjectPtrCycle/c.txt
test/bin/ObjectPtrToBase/Test.c
test/bin/ObjectPtrToBase/c.exe
test/bin/ObjectPtrToBase/c.txt
test/bin/ObjectPtrToDynamic/Test.c
test/bin/ObjectPtrToDynamic/c.exe
test/bin/ObjectPtrToDynamic/c.txt
test/bin/ObjectPtrToStg/Test.c
test/bin/ObjectPtrToStg/c.exe
test/bin/ObjectPtrToStg/c.txt
test/bin/OpAddAssignString/Test.c
test/bin/OpAddAssignString/c.exe
test/bin/OpAddAssignString/c.txt
test/bin/OpAddNum/Test.c
test/bin/OpAddNum/c.exe
test/bin/OpAddNum/c.txt
test/bin/OpAddString/Test.c
test/bin/OpAddString/c.exe
test/bin/OpAddString/Test.c:10:30: error: invalid operands to binary expression ('char *' and 'char *')
        bool returnValue = strcmp(s + s, "foofoo") == 0 && strcmp(s + p, "foobar") == 0 && strcmp(p + s, "barfoo") == 0 && strcmp(p + p, "barbar") == 0 && strcmp(s + "quux", "fooquux") == 0 && strcmp("quux" + s, "quuxfoo") == 0 && strcmp(p + "quux", "barquux") == 0 && strcmp("quux" + p, "quuxbar") == 0;
                                  ~ ^ ~
test/bin/OpAddString/Test.c:10:62: error: invalid operands to binary expression ('char *' and 'const char *')
        bool returnValue = strcmp(s + s, "foofoo") == 0 && strcmp(s + p, "foobar") == 0 && strcmp(p + s, "barfoo") == 0 && strcmp(p + p, "barbar") == 0 && strcmp(s + "quux", "fooquux") == 0 && strcmp("quux" + s, "quuxfoo") == 0 && strcmp(p + "quux", "barquux") == 0 && strcmp("quux" + p, "quuxbar") == 0;
                                                                  ~ ^ ~
test/bin/OpAddString/Test.c:10:94: error: invalid operands to binary expression ('const char *' and 'char *')
        bool returnValue = strcmp(s + s, "foofoo") == 0 && strcmp(s + p, "foobar") == 0 && strcmp(p + s, "barfoo") == 0 && strcmp(p + p, "barbar") == 0 && strcmp(s + "quux", "fooquux") == 0 && strcmp("quux" + s, "quuxfoo") == 0 && strcmp(p + "quux", "barquux") == 0 && strcmp("quux" + p, "quuxbar") == 0;
                                                                                                  ~ ^ ~
test/bin/OpAddString/Test.c:10:126: error: invalid operands to binary expression ('const char *' and 'const char *')
        bool returnValue = strcmp(s + s, "foofoo") == 0 && strcmp(s + p, "foobar") == 0 && strcmp(p + s, "barfoo") == 0 && strcmp(p + p, "barbar") == 0 && strcmp(s + "quux", "fooquux") == 0 && strcmp("quux" + s, "quuxfoo") == 0 && strcmp(p + "quux", "barquux") == 0 && strcmp("quux" + p, "quuxbar") == 0;
                                                                                                                                  ~ ^ ~
test/bin/OpAddString/Test.c:10:158: error: invalid operands to binary expression ('char *' and 'char [5]')
        bool returnValue = strcmp(s + s, "foofoo") == 0 && strcmp(s + p, "foobar") == 0 && strcmp(p + s, "barfoo") == 0 && strcmp(p + p, "barbar") == 0 && strcmp(s + "quux", "fooquux") == 0 && strcmp("quux" + s, "quuxfoo") == 0 && strcmp(p + "quux", "barquux") == 0 && strcmp("quux" + p, "quuxbar") == 0;
                                                                                                                                                                  ~ ^ ~~~~~~
test/bin/OpAddString/Test.c:10:201: error: invalid operands to binary expression ('char [5]' and 'char *')
        bool returnValue = strcmp(s + s, "foofoo") == 0 && strcmp(s + p, "foobar") == 0 && strcmp(p + s, "barfoo") == 0 && strcmp(p + p, "barbar") == 0 && strcmp(s + "quux", "fooquux") == 0 && strcmp("quux" + s, "quuxfoo") == 0 && strcmp(p + "quux", "barquux") == 0 && strcmp("quux" + p, "quuxbar") == 0;
                                                                                                                                                                                                        ~~~~~~ ^ ~
test/bin/OpAddString/Test.c:10:234: error: invalid operands to binary expression ('const char *' and 'char [5]')
        bool returnValue = strcmp(s + s, "foofoo") == 0 && strcmp(s + p, "foobar") == 0 && strcmp(p + s, "barfoo") == 0 && strcmp(p + p, "barbar") == 0 && strcmp(s + "quux", "fooquux") == 0 && strcmp("quux" + s, "quuxfoo") == 0 && strcmp(p + "quux", "barquux") == 0 && strcmp("quux" + p, "quuxbar") == 0;
                                                                                                                                                                                                                                              ~ ^ ~~~~~~
test/bin/OpAddString/Test.c:10:277: error: invalid operands to binary expression ('char [5]' and 'const char *')
        bool returnValue = strcmp(s + s, "foofoo") == 0 && strcmp(s + p, "foobar") == 0 && strcmp(p + s, "barfoo") == 0 && strcmp(p + p, "barbar") == 0 && strcmp(s + "quux", "fooquux") == 0 && strcmp("quux" + s, "quuxfoo") == 0 && strcmp(p + "quux", "barquux") == 0 && strcmp("quux" + p, "quuxbar") == 0;
                                                                                                                                                                                                                                                                                    ~~~~~~ ^ ~
8 errors generated.
		return s + s == "foofoo" //FAIL: c
test/bin/OpAddString/c.txt
/bin/sh: ./test/bin/OpAddString/c.exe: No such file or directory
		return s + s == "foofoo" //FAIL: c
test/bin/OpAnd/Test.c
test/bin/OpAnd/c.exe
test/bin/OpAnd/c.txt
test/bin/OpAssignChained/Test.c
test/bin/OpAssignChained/c.exe
test/bin/OpAssignChained/c.txt
test/bin/OpBitAssignByte/Test.c
test/bin/OpBitAssignByte/c.exe
test/bin/OpBitAssignByte/c.txt
test/bin/OpComplement/Test.c
test/bin/OpComplement/c.exe
test/bin/OpComplement/c.txt
test/bin/OpCond/Test.c
test/bin/OpCond/c.exe
test/bin/OpCond/c.txt
test/bin/OpCondAnd/Test.c
test/bin/OpCondAnd/c.exe
test/bin/OpCondAnd/c.txt
test/bin/OpCondOr/Test.c
test/bin/OpCondOr/c.exe
test/bin/OpCondOr/c.txt
test/bin/OpDivAssignInt/Test.c
test/bin/OpDivAssignInt/c.exe
test/bin/OpDivAssignInt/c.txt
test/bin/OpDivDouble/Test.c
test/bin/OpDivDouble/c.exe
test/bin/OpDivDouble/c.txt
test/bin/OpDivInt/Test.c
test/bin/OpDivInt/c.exe
test/bin/OpDivInt/c.txt
test/bin/OpEqualArrayPtr/Test.c
test/bin/OpEqualArrayPtr/c.exe
test/bin/OpEqualArrayPtr/c.txt
test/bin/OpEqualNull/Test.c
test/bin/OpEqualNull/c.exe
test/bin/OpEqualNull/c.txt
test/bin/OpEqualNum/Test.c
test/bin/OpEqualNum/c.exe
test/bin/OpEqualNum/c.txt
test/bin/OpEqualObjectPtr/Test.c
test/bin/OpEqualObjectPtr/c.exe
test/bin/OpEqualObjectPtr/c.txt
test/bin/OpEqualString/Test.c
test/bin/OpEqualString/c.exe
test/bin/OpEqualString/c.txt
test/bin/OpField/Test.c
test/bin/OpField/c.exe
test/bin/OpField/c.txt
test/bin/OpGreater/Test.c
test/bin/OpGreater/c.exe
test/bin/OpGreater/c.txt
test/bin/OpGreaterOrEqual/Test.c
test/bin/OpGreaterOrEqual/c.exe
test/bin/OpGreaterOrEqual/c.txt
test/bin/OpIndexArrayPtr/Test.c
test/bin/OpIndexArrayPtr/c.exe
test/bin/OpIndexArrayPtr/c.txt
test/bin/OpIndexArrayStorage/Test.c
test/bin/OpIndexArrayStorage/c.exe
test/bin/OpIndexArrayStorage/c.txt
test/bin/OpIndexString/Test.c
test/bin/OpIndexString/c.exe
test/bin/OpIndexString/c.txt
test/bin/OpLess/Test.c
test/bin/OpLess/c.exe
test/bin/OpLess/c.txt
test/bin/OpLessOrEqual/Test.c
test/bin/OpLessOrEqual/c.exe
test/bin/OpLessOrEqual/c.txt
test/bin/OpMod/Test.c
test/bin/OpMod/c.exe
test/bin/OpMod/c.txt
test/bin/OpMul/Test.c
test/bin/OpMul/c.exe
test/bin/OpMul/c.txt
test/bin/OpNeg/Test.c
test/bin/OpNeg/c.exe
test/bin/OpNeg/c.txt
test/bin/OpNot/Test.c
test/bin/OpNot/c.exe
test/bin/OpNot/c.txt
test/bin/OpNotEqualArrayPtr/Test.c
test/bin/OpNotEqualArrayPtr/c.exe
test/bin/OpNotEqualArrayPtr/c.txt
test/bin/OpNotEqualNull/Test.c
test/bin/OpNotEqualNull/c.exe
test/bin/OpNotEqualNull/c.txt
test/bin/OpNotEqualNum/Test.c
test/bin/OpNotEqualNum/c.exe
test/bin/OpNotEqualNum/c.txt
test/bin/OpNotEqualString/Test.c
test/bin/OpNotEqualString/c.exe
test/bin/OpNotEqualString/c.txt
test/bin/OpOr/Test.c
test/bin/OpOr/c.exe
test/bin/OpOr/c.txt
test/bin/OpParentheses/Test.c
test/bin/OpParentheses/c.exe
test/bin/OpParentheses/c.txt
test/bin/OpPostDec/Test.c
test/bin/OpPostDec/c.exe
test/bin/OpPostDec/c.txt
test/bin/OpPostInc/Test.c
test/bin/OpPostInc/c.exe
test/bin/OpPostInc/c.txt
test/bin/OpPostIncFor/Test.c
test/bin/OpPostIncFor/c.exe
test/bin/OpPostIncFor/c.txt
test/bin/OpPostIncIf/Test.c
test/bin/OpPostIncIf/c.exe
test/bin/OpPostIncIf/c.txt
test/bin/OpPostIncReturn/Test.c
test/bin/OpPostIncReturn/c.exe
test/bin/OpPostIncReturn/c.txt
test/bin/OpPostIncWhile/Test.c
test/bin/OpPostIncWhile/c.exe
test/bin/OpPostIncWhile/c.txt
test/bin/OpPreDec/Test.c
test/bin/OpPreDec/c.exe
test/bin/OpPreDec/c.txt
test/bin/OpPreDecDoWhile/Test.c
test/bin/OpPreDecDoWhile/c.exe
test/bin/OpPreDecDoWhile/c.txt
test/bin/OpPreInc/Test.c
test/bin/OpPreInc/c.exe
test/bin/OpPreInc/c.txt
test/bin/OpPreIncIf/Test.c
test/bin/OpPreIncIf/c.exe
test/bin/OpPreIncIf/c.txt
test/bin/OpPreIncWhile/Test.c
test/bin/OpPreIncWhile/c.exe
test/bin/OpPreIncWhile/c.txt
test/bin/OpShiftLeft/Test.c
test/bin/OpShiftLeft/c.exe
test/bin/OpShiftLeft/c.txt
test/bin/OpShiftRight/Test.c
test/bin/OpShiftRight/c.exe
test/bin/OpShiftRight/c.txt
test/bin/OpSub/Test.c
test/bin/OpSub/c.exe
test/bin/OpSub/c.txt
test/bin/OpXor/Test.c
test/bin/OpXor/c.exe
test/bin/OpXor/c.txt
test/bin/PreAnd/Test.c
test/bin/PreAnd/c.exe
test/bin/PreAnd/c.txt
test/bin/PreCommentSingleLine/Test.c
test/bin/PreCommentSingleLine/c.exe
test/bin/PreCommentSingleLine/c.txt
test/bin/PreElif/Test.c
test/bin/PreElif/c.exe
test/bin/PreElif/c.txt
test/bin/PreElse/Test.c
test/bin/PreElse/c.exe
test/bin/PreElse/c.txt
test/bin/PreIf/Test.c
test/bin/PreIf/c.exe
test/bin/PreIf/c.txt
test/bin/PreNot/Test.c
test/bin/PreNot/c.exe
test/bin/PreNot/c.txt
test/bin/PreOr/Test.c
test/bin/PreOr/c.exe
test/bin/PreOr/c.txt
test/bin/PreParentheses/Test.c
test/bin/PreParentheses/c.exe
test/bin/PreParentheses/c.txt
test/bin/PreUndefined/Test.c
test/bin/PreUndefined/c.exe
test/bin/PreUndefined/c.txt
test/bin/Range/Test.c
test/bin/Range/c.exe
test/bin/Range/c.txt
test/bin/RegexEscape/Test.c
Unhandled exception. System.NotImplementedException: CiConst
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 112
   at Foxoft.Ci.GenC.WriteArgsAndRightParenthesis(CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 654
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 741
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 602
   at Foxoft.Ci.GenTyped.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenTyped.cs:line 249
   at Foxoft.Ci.GenC.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 589
   at Foxoft.Ci.GenBase.WriteCoerced(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 623
   at Foxoft.Ci.GenC.Visit(CiReturn statement) in /Users/coke/sandbox/cito/GenC.cs:line 1170
   at Foxoft.Ci.CiReturn.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 668
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		return Regex.IsMatch("a+b+c", pattern); //FAIL: c cpp js swift TODO; cl
test/bin/RegexEscape/c.exe
clang: error: no such file or directory: 'test/bin/RegexEscape/Test.c'
		return Regex.IsMatch("a+b+c", pattern); //FAIL: c cpp js swift TODO; cl
test/bin/RegexEscape/c.txt
/bin/sh: ./test/bin/RegexEscape/c.exe: No such file or directory
		return Regex.IsMatch("a+b+c", pattern); //FAIL: c cpp js swift TODO; cl
test/bin/RegexIsMatch/Test.c
Unhandled exception. System.NotImplementedException: CiConst
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 112
   at Foxoft.Ci.GenC.WriteArgsAndRightParenthesis(CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 654
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 741
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.Write(CiExpr expr, CiPriority parent, CiBinaryExpr binary) in /Users/coke/sandbox/cito/GenBase.cs:line 847
   at Foxoft.Ci.GenBase.Write(CiBinaryExpr expr, Boolean parentheses, CiPriority left, String op, CiPriority right) in /Users/coke/sandbox/cito/GenBase.cs:line 854
   at Foxoft.Ci.GenBase.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1001
   at Foxoft.Ci.GenC.Visit(CiBinaryExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 926
   at Foxoft.Ci.CiBinaryExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 443
   at Foxoft.Ci.GenBase.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 602
   at Foxoft.Ci.GenTyped.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenTyped.cs:line 249
   at Foxoft.Ci.GenC.WriteCoercedInternal(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 589
   at Foxoft.Ci.GenBase.WriteCoerced(CiType type, CiExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 623
   at Foxoft.Ci.GenBase.Visit(CiReturn statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1162
   at Foxoft.Ci.GenC.Visit(CiReturn statement) in /Users/coke/sandbox/cito/GenC.cs:line 1152
   at Foxoft.Ci.CiReturn.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 668
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		return Regex.IsMatch(s, "^\\d+$") //FAIL: c cpp swift TODO; cl
test/bin/RegexIsMatch/c.exe
clang: error: no such file or directory: 'test/bin/RegexIsMatch/Test.c'
		return Regex.IsMatch(s, "^\\d+$") //FAIL: c cpp swift TODO; cl
test/bin/RegexIsMatch/c.txt
/bin/sh: ./test/bin/RegexIsMatch/c.exe: No such file or directory
		return Regex.IsMatch(s, "^\\d+$") //FAIL: c cpp swift TODO; cl
test/bin/RegexMatch/Test.c
Unhandled exception. System.ArgumentNullException: Value cannot be null. (Parameter 'source')
   at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
   at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
   at Foxoft.Ci.GenC.NeedsDestructor(CiClass klass) in /Users/coke/sandbox/cito/GenC.cs:line 1424
   at Foxoft.Ci.GenC.NeedToDestruct(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 469
   at Foxoft.Ci.GenC.WriteVar(CiNamedValue def) in /Users/coke/sandbox/cito/GenC.cs:line 477
   at Foxoft.Ci.GenBase.Visit(CiVar expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 723
   at Foxoft.Ci.CiVar.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 277
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		return m.Find(s, "(B.+?) (\\wo\\w)", RegexOptions.IgnoreCase | RegexOptions.Singleline) //FAIL: c cpp swift TODO; cl
test/bin/RegexMatch/c.exe
clang: error: no such file or directory: 'test/bin/RegexMatch/Test.c'
		return m.Find(s, "(B.+?) (\\wo\\w)", RegexOptions.IgnoreCase | RegexOptions.Singleline) //FAIL: c cpp swift TODO; cl
test/bin/RegexMatch/c.txt
/bin/sh: ./test/bin/RegexMatch/c.exe: No such file or directory
		return m.Find(s, "(B.+?) (\\wo\\w)", RegexOptions.IgnoreCase | RegexOptions.Singleline) //FAIL: c cpp swift TODO; cl
test/bin/StAssert/Test.c
test/bin/StAssert/c.exe
test/bin/StAssert/c.txt
test/bin/StBlock/Test.c
test/bin/StBlock/c.exe
test/bin/StBlock/c.txt
test/bin/StBreakSwitch/Test.c
test/bin/StBreakSwitch/c.exe
test/bin/StBreakSwitch/c.txt
test/bin/StBreakWhile/Test.c
test/bin/StBreakWhile/c.exe
test/bin/StBreakWhile/c.txt
test/bin/StContinueDoWhile/Test.c
test/bin/StContinueDoWhile/c.exe
test/bin/StContinueDoWhile/c.txt
test/bin/StContinueFor/Test.c
test/bin/StContinueFor/c.exe
test/bin/StContinueFor/c.txt
test/bin/StContinueWhile/Test.c
test/bin/StContinueWhile/c.exe
test/bin/StContinueWhile/c.txt
test/bin/StDoWhile/Test.c
test/bin/StDoWhile/c.exe
test/bin/StDoWhile/c.txt
test/bin/StElse/Test.c
test/bin/StElse/c.exe
test/bin/StElse/c.txt
test/bin/StElseIf/Test.c
test/bin/StElseIf/c.exe
test/bin/StElseIf/c.txt
test/bin/StFor/Test.c
test/bin/StFor/c.exe
test/bin/StFor/c.txt
test/bin/StForFloat/Test.c
test/bin/StForFloat/c.exe
test/bin/StForFloat/c.txt
test/bin/StForNotRange/Test.c
test/bin/StForNotRange/c.exe
test/bin/StForNotRange/c.txt
test/bin/StForRangeDec/Test.c
test/bin/StForRangeDec/c.exe
test/bin/StForRangeDec/c.txt
test/bin/StForRangeStep/Test.c
test/bin/StForRangeStep/c.exe
test/bin/StForRangeStep/c.txt
test/bin/StForeachArrayStg/Test.c
test/bin/StForeachArrayStg/c.exe
test/bin/StForeachArrayStg/c.txt
test/bin/StForeachDictionary/Test.c
Unhandled exception. System.InvalidCastException: Unable to cast object of type 'Foxoft.Ci.CiDictionaryType' to type 'Foxoft.Ci.CiArrayStorageType'.
   at Foxoft.Ci.GenC.Visit(CiForeach statement) in /Users/coke/sandbox/cito/GenC.cs:line 1137
   at Foxoft.Ci.CiForeach.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 644
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		Dictionary<int, int>() dict; //FAIL: c cl
test/bin/StForeachDictionary/c.exe
clang: error: no such file or directory: 'test/bin/StForeachDictionary/Test.c'
		Dictionary<int, int>() dict; //FAIL: c cl
test/bin/StForeachDictionary/c.txt
/bin/sh: ./test/bin/StForeachDictionary/c.exe: No such file or directory
		Dictionary<int, int>() dict; //FAIL: c cl
test/bin/StForeachList/Test.c
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Foxoft.Ci.GenC.WriteName(CiSymbol symbol) in /Users/coke/sandbox/cito/GenC.cs:line 174
   at Foxoft.Ci.GenC.WriteCCall(CiExpr obj, CiMethod method, CiExpr[] args) in /Users/coke/sandbox/cito/GenC.cs:line 726
   at Foxoft.Ci.GenC.WriteCall(CiExpr obj, CiMethod method, CiExpr[] args, CiPriority parent) in /Users/coke/sandbox/cito/GenC.cs:line 848
   at Foxoft.Ci.GenBase.Visit(CiCallExpr expr, CiPriority parent) in /Users/coke/sandbox/cito/GenBase.cs:line 1048
   at Foxoft.Ci.CiCallExpr.Accept(CiVisitor visitor, CiPriority parent) in /Users/coke/sandbox/cito/CiTree.cs:line 580
   at Foxoft.Ci.GenBase.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenBase.cs:line 1054
   at Foxoft.Ci.GenC.Visit(CiExpr statement) in /Users/coke/sandbox/cito/GenC.cs:line 1126
   at Foxoft.Ci.CiExpr.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 114
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		List<int>() list; //FAIL: c cl
test/bin/StForeachList/c.exe
clang: error: no such file or directory: 'test/bin/StForeachList/Test.c'
		List<int>() list; //FAIL: c cl
test/bin/StForeachList/c.txt
/bin/sh: ./test/bin/StForeachList/c.exe: No such file or directory
		List<int>() list; //FAIL: c cl
test/bin/StForeachSortedDictionary/Test.c
Unhandled exception. System.InvalidCastException: Unable to cast object of type 'Foxoft.Ci.CiSortedDictionaryType' to type 'Foxoft.Ci.CiArrayStorageType'.
   at Foxoft.Ci.GenC.Visit(CiForeach statement) in /Users/coke/sandbox/cito/GenC.cs:line 1137
   at Foxoft.Ci.CiForeach.Accept(CiVisitor visitor) in /Users/coke/sandbox/cito/CiTree.cs:line 644
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements, Int32 length) in /Users/coke/sandbox/cito/GenBase.cs:line 1067
   at Foxoft.Ci.GenBase.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenBase.cs:line 1072
   at Foxoft.Ci.GenC.Write(CiStatement[] statements) in /Users/coke/sandbox/cito/GenC.cs:line 1258
   at Foxoft.Ci.GenC.Write(CiClass klass, CiMethod method) in /Users/coke/sandbox/cito/GenC.cs:line 1659
   at Foxoft.Ci.GenC.Write(CiProgram program) in /Users/coke/sandbox/cito/GenC.cs:line 1907
   at Foxoft.Ci.CiTo.Main(String[] args) in /Users/coke/sandbox/cito/CiTo.cs:line 133
		SortedDictionary<int, int>() dict; //FAIL: c cl
test/bin/StForeachSortedDictionary/c.exe
clang: error: no such file or directory: 'test/bin/StForeachSortedDictionary/Test.c'
		SortedDictionary<int, int>() dict; //FAIL: c cl
test/bin/StForeachSortedDictionary/c.txt
/bin/sh: ./test/bin/StForeachSortedDictionary/c.exe: No such file or directory
		SortedDictionary<int, int>() dict; //FAIL: c cl
test/bin/StIf/Test.c
test/bin/StIf/c.exe
test/bin/StIf/c.txt
test/bin/StNative/Test.c
test/bin/StNative/c.exe
test/bin/StNative/c.txt
test/bin/StReturn/Test.c
test/bin/StReturn/c.exe
test/bin/StReturn/c.txt
test/bin/StReturnConstructor/Test.c
test/bin/StReturnConstructor/c.exe
test/bin/StReturnConstructor/c.txt
test/bin/StReturnDynamic/Test.c
test/bin/StReturnDynamic/c.exe
test/bin/StReturnDynamic/c.txt
test/bin/StReturnPtr/Test.c
test/bin/StReturnPtr/c.exe
test/bin/StReturnPtr/c.txt
test/bin/StReturnStringNull/Test.c
test/bin/StReturnStringNull/c.exe
test/bin/StReturnStringNull/c.txt
test/bin/StReturnStringStg/Test.c
test/bin/StReturnStringStg/c.exe
test/bin/StReturnStringStg/c.txt
test/bin/StSwitch/Test.c
test/bin/StSwitch/c.exe
test/bin/StSwitch/c.txt
test/bin/StSwitchEnum/Test.c
test/bin/StSwitchEnum/c.exe
test/bin/StSwitchEnum/c.txt
test/bin/StSwitchVar/Test.c
test/bin/StSwitchVar/c.exe
test/bin/StSwitchVar/c.txt
test/bin/StSwitchVarStringStg/Test.c
test/bin/StSwitchVarStringStg/c.exe
test/bin/StSwitchVarStringStg/c.txt
test/bin/StThrow/Test.c
test/bin/StThrow/c.exe
test/bin/StThrow/c.txt
test/bin/StWhile/Test.c
test/bin/StWhile/c.exe
test/bin/StWhile/c.txt
test/bin/StringContains/Test.c
test/bin/StringContains/c.exe
test/bin/StringContains/c.txt
test/bin/StringEndsWith/Test.c
test/bin/StringEndsWith/c.exe
test/bin/StringEndsWith/c.txt
test/bin/StringIndexOf/Test.c
test/bin/StringIndexOf/c.exe
test/bin/StringIndexOf/c.txt
test/bin/StringInterpolated/Test.c
test/bin/StringInterpolated/c.exe
test/bin/StringInterpolated/c.txt
test/bin/StringInterpolatedFormat/Test.c
test/bin/StringInterpolatedFormat/c.exe
test/bin/StringInterpolatedFormat/c.txt
test/bin/StringLastIndexOf/Test.c
test/bin/StringLastIndexOf/c.exe
test/bin/StringLastIndexOf/c.txt
test/bin/StringLength/Test.c
test/bin/StringLength/c.exe
test/bin/StringLength/c.txt
test/bin/StringStartsWith/Test.c
test/bin/StringStartsWith/c.exe
test/bin/StringStartsWith/c.txt
test/bin/StringStg/Test.c
test/bin/StringStg/c.exe
test/bin/StringStg/c.txt
test/bin/StringStgInitPtr/Test.c
test/bin/StringStgInitPtr/c.exe
test/bin/StringStgInitPtr/c.txt
test/bin/StringSubstring/Test.c
test/bin/StringSubstring/c.exe
test/bin/StringSubstring/c.txt
test/bin/StringSubstringZero/Test.c
test/bin/StringSubstringZero/c.exe
test/bin/StringSubstringZero/c.txt
test-c
PASSED c=201/221
test/bin/ArrayCopyTo/Test.cpp
test/bin/ArrayCopyTo/cpp.exe
test/bin/ArrayCopyTo/cpp.txt
test/bin/ArrayFill/Test.cpp
test/bin/ArrayFill/cpp.exe
test/bin/ArrayFill/cpp.txt
test/bin/ArrayLength/Test.cpp
test/bin/ArrayLength/cpp.exe
test/bin/ArrayLength/cpp.txt
test/bin/ArrayPtrMultiDim/Test.cpp
test/bin/ArrayPtrMultiDim/cpp.exe
test/bin/ArrayPtrMultiDim/cpp.txt
test/bin/ArrayStgInit/Test.cpp
test/bin/ArrayStgInit/cpp.exe
test/bin/ArrayStgInit/cpp.txt
test/bin/ArrayStgInitField/Test.cpp
test/bin/ArrayStgInitField/cpp.exe
test/bin/ArrayStgInitField/cpp.txt
test/bin/ArrayStgMultiDim/Test.cpp
test/bin/ArrayStgMultiDim/cpp.exe
test/bin/ArrayStgMultiDim/cpp.txt
test/bin/ArrayStgObjectStg/Test.cpp
test/bin/ArrayStgObjectStg/cpp.exe
test/bin/ArrayStgObjectStg/cpp.txt
test/bin/ArrayStgStringStg/Test.cpp
test/bin/ArrayStgStringStg/cpp.exe
test/bin/ArrayStgStringStg/cpp.txt
test/bin/Basic/Test.cpp
test/bin/Basic/cpp.exe
test/bin/Basic/cpp.txt
test/bin/ByteArray/Test.cpp
test/bin/ByteArray/cpp.exe
test/bin/ByteArray/cpp.txt
test/bin/ClassForwardBase/Test.cpp
test/bin/ClassForwardBase/cpp.exe
test/bin/ClassForwardBase/cpp.txt
test/bin/ClassForwardPtr/Test.cpp
test/bin/ClassForwardPtr/cpp.exe
test/bin/ClassForwardPtr/cpp.txt
test/bin/ClassForwardStg/Test.cpp
test/bin/ClassForwardStg/cpp.exe
test/bin/ClassForwardStg/cpp.txt
test/bin/CollectionPtrCycle/Test.cpp
test/bin/CollectionPtrCycle/cpp.exe
test/bin/CollectionPtrCycle/cpp.txt
test/bin/ConstArrayInt/Test.cpp
test/bin/ConstArrayInt/cpp.exe
test/bin/ConstArrayInt/cpp.txt
test/bin/ConstArrayNoLen/Test.cpp
test/bin/ConstArrayNoLen/cpp.exe
test/bin/ConstArrayNoLen/cpp.txt
test/bin/ConstBool/Test.cpp
test/bin/ConstBool/cpp.exe
test/bin/ConstBool/cpp.txt
test/bin/ConstByteArray/Test.cpp
test/bin/ConstByteArray/cpp.exe
test/bin/ConstByteArray/cpp.txt
test/bin/ConstDouble/Test.cpp
test/bin/ConstDouble/cpp.exe
test/bin/ConstDouble/cpp.txt
test/bin/ConstEnum/Test.cpp
test/bin/ConstEnum/cpp.exe
test/bin/ConstEnum/cpp.txt
test/bin/ConstInt/Test.cpp
test/bin/ConstInt/cpp.exe
test/bin/ConstInt/cpp.txt
test/bin/ConstLocalMany/Test.cpp
test/bin/ConstLocalMany/cpp.exe
test/bin/ConstLocalMany/cpp.txt
test/bin/ConstLong/Test.cpp
test/bin/ConstLong/cpp.exe
test/bin/ConstLong/cpp.txt
			&& i * Bar == Foo; //FAIL: c cpp cs java
test/bin/ConstString/Test.cpp
test/bin/ConstString/cpp.exe
test/bin/ConstString/cpp.txt
test/bin/ConstStringInterpolated/Test.cpp
test/bin/ConstStringInterpolated/cpp.exe
test/bin/ConstStringInterpolated/cpp.txt
test/bin/Doc/Test.cpp
test/bin/Doc/cpp.exe
test/bin/Doc/cpp.txt
test/bin/DynamicArrayMultiDim/Test.cpp
test/bin/DynamicArrayMultiDim/cpp.exe
test/bin/DynamicArrayMultiDim/Test.cpp:8:44: error: no matching function for call to 'make_shared'
        std::shared_ptr<std::array<int, 3>[]> a = std::make_shared<std::array<int, 3>[]>(2);
                                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:4707:1: note: candidate template ignored: requirement '!is_array<std::__1::array<int, 3> []>::value' was not satisfied [with _Tp = std::__1::array<int, 3> []]
make_shared(_Args&& ...__args)
^
test/bin/DynamicArrayMultiDim/Test.cpp:9:3: error: type 'std::shared_ptr<std::array<int, 3> []>' does not provide a subscript operator
        a[0][0] = 1;
        ~^~
test/bin/DynamicArrayMultiDim/Test.cpp:10:3: error: type 'std::shared_ptr<std::array<int, 3> []>' does not provide a subscript operator
        a[0][1] = 2;
        ~^~
test/bin/DynamicArrayMultiDim/Test.cpp:11:3: error: type 'std::shared_ptr<std::array<int, 3> []>' does not provide a subscript operator
        a[0][2] = 3;
        ~^~
test/bin/DynamicArrayMultiDim/Test.cpp:12:3: error: type 'std::shared_ptr<std::array<int, 3> []>' does not provide a subscript operator
        a[1][0] = 4;
        ~^~
test/bin/DynamicArrayMultiDim/Test.cpp:13:3: error: type 'std::shared_ptr<std::array<int, 3> []>' does not provide a subscript operator
        a[1][1] = 5;
        ~^~
test/bin/DynamicArrayMultiDim/Test.cpp:14:3: error: type 'std::shared_ptr<std::array<int, 3> []>' does not provide a subscript operator
        a[1][2] = 6;
        ~^~
test/bin/DynamicArrayMultiDim/Test.cpp:18:12: error: type 'std::shared_ptr<std::array<int, 3> []>' does not provide a subscript operator
                        sum += a[i][j];
                               ~^~
8 errors generated.
		int[]#[3] a = new int[2][3]; //FAIL: cpp - should work with C++20; cs js TODO; cl
test/bin/DynamicArrayMultiDim/cpp.txt
/bin/sh: ./test/bin/DynamicArrayMultiDim/cpp.exe: No such file or directory
		int[]#[3] a = new int[2][3]; //FAIL: cpp - should work with C++20; cs js TODO; cl
test/bin/DynamicAssign/Test.cpp
test/bin/DynamicAssign/cpp.exe
test/bin/DynamicAssign/Test.cpp:12:6: error: no matching function for call to 'make_shared'
        a = std::make_shared<int[]>(2);
            ^~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:4707:1: note: candidate template ignored: requirement '!is_array<int []>::value' was not satisfied [with _Tp = int []]
make_shared(_Args&& ...__args)
^
test/bin/DynamicAssign/Test.cpp:13:3: error: type 'std::shared_ptr<int []>' does not provide a subscript operator
        a[0] = 5;
        ~^~
test/bin/DynamicAssign/Test.cpp:14:3: error: type 'std::shared_ptr<int []>' does not provide a subscript operator
        a[1] = 10;
        ~^~
test/bin/DynamicAssign/Test.cpp:17:36: error: type 'std::shared_ptr<int []>' does not provide a subscript operator
        return p->foo == 42 && q == p && a[0] == 5 && a[1] == 10 && b[0] == 5 && b[1] == 10 && b == a;
                                         ~^~
test/bin/DynamicAssign/Test.cpp:17:49: error: type 'std::shared_ptr<int []>' does not provide a subscript operator
        return p->foo == 42 && q == p && a[0] == 5 && a[1] == 10 && b[0] == 5 && b[1] == 10 && b == a;
                                                      ~^~
test/bin/DynamicAssign/Test.cpp:17:63: error: type 'std::shared_ptr<int []>' does not provide a subscript operator
        return p->foo == 42 && q == p && a[0] == 5 && a[1] == 10 && b[0] == 5 && b[1] == 10 && b == a;
                                                                    ~^~
test/bin/DynamicAssign/Test.cpp:17:76: error: type 'std::shared_ptr<int []>' does not provide a subscript operator
        return p->foo == 42 && q == p && a[0] == 5 && a[1] == 10 && b[0] == 5 && b[1] == 10 && b == a;
                                                                                 ~^~
7 errors generated.
make: *** [test/bin/DynamicAssign/cpp.exe] Error 1
rm test/bin/ArrayStgInit/cpp.exe test/bin/OpPostInc/c.exe test/bin/DynamicPtrArray/c.exe test/bin/ConstLocalMany/c.exe test/bin/StElse/c.exe test/bin/Long/c.exe test/bin/NativeTopLevel/c.exe test/bin/LibMathIsNaN/c.exe test/bin/OpMod/c.exe test/bin/ObjectFieldInit/c.exe test/bin/ConstByteArray/c.exe test/bin/ArrayStgInitField/cpp.exe test/bin/EncodingGetString/c.exe test/bin/StSwitch/c.exe test/bin/OpEqualNull/c.exe test/bin/ByteArray/c.exe test/bin/StForeachArrayStg/c.exe test/bin/StSwitchVarStringStg/c.exe test/bin/MethodOverride/c.exe test/bin/StBlock/c.exe test/bin/LexLiteralHex/c.exe test/bin/ClassForwardPtr/cpp.exe test/bin/LibMathPI/c.exe test/bin/StringInterpolatedFormat/c.exe test/bin/OpParentheses/c.exe test/bin/StReturnConstructor/c.exe test/bin/OpIndexArrayStorage/c.exe test/bin/OpShiftRight/c.exe test/bin/Keyword/c.exe test/bin/ObjectConstructorBase/c.exe test/bin/StReturnStringNull/c.exe test/bin/ConstArrayInt/cpp.exe test/bin/OpLessOrEqual/c.exe test/bin/StForFloat/c.exe test/bin/OpComplement/c.exe test/bin/LibMathCeiling/c.exe test/bin/ObjectPtrCycle/c.exe test/bin/PreCommentSingleLine/c.exe test/bin/ConstByteArray/cpp.exe test/bin/OpPreIncIf/c.exe test/bin/ConstEnum/cpp.exe test/bin/LibConsoleErrorWriteLine/c.exe test/bin/OpPostIncReturn/c.exe test/bin/OpNot/c.exe test/bin/LibMathTanh/c.exe test/bin/Basic/cpp.exe test/bin/ArrayStgInit/c.exe test/bin/ArrayStgObjectStg/cpp.exe test/bin/ConstEnum/c.exe test/bin/LibMathAcos/c.exe test/bin/StReturnPtr/c.exe test/bin/StringSubstring/c.exe test/bin/DynamicAssign/c.exe test/bin/EnumFlags/c.exe test/bin/LibMathAtan/c.exe test/bin/StringIndexOf/c.exe test/bin/ArrayCopyTo/cpp.exe test/bin/OpDivDouble/c.exe test/bin/ObjectConstructor/c.exe test/bin/LibConsoleWrite/c.exe test/bin/CollectionPtrCycle/cpp.exe test/bin/LexCommentSingleLine/c.exe test/bin/StContinueDoWhile/c.exe test/bin/ObjectFieldProtected/c.exe test/bin/OpCond/c.exe test/bin/OpNotEqualString/c.exe test/bin/OpXor/c.exe test/bin/MethodShort/c.exe test/bin/MethodParamByte/c.exe test/bin/ConstInt/c.exe test/bin/LibMathCos/c.exe test/bin/LibMathFloor/c.exe test/bin/StSwitchVar/c.exe test/bin/DynamicByteArray/c.exe test/bin/MethodParamDynamic/c.exe test/bin/ObjectPtrToDynamic/c.exe test/bin/StAssert/c.exe test/bin/StReturn/c.exe test/bin/StringInterpolated/c.exe test/bin/ArrayStgObjectStg/c.exe test/bin/EnumValue/c.exe test/bin/OpEqualArrayPtr/c.exe test/bin/OpCondOr/c.exe test/bin/PreIf/c.exe test/bin/LibMathSinh/c.exe test/bin/LibMathNaN/c.exe test/bin/OpField/c.exe test/bin/ConstArrayNoLen/c.exe test/bin/ArrayPtrMultiDim/cpp.exe test/bin/ClassForwardStg/c.exe test/bin/StringEndsWith/c.exe test/bin/MethodVoid/c.exe test/bin/OpNeg/c.exe test/bin/ArrayFill/c.exe test/bin/LibMathTan/c.exe test/bin/DynamicReset/c.exe test/bin/ConstBool/cpp.exe test/bin/LibMathLog10/c.exe test/bin/OpBitAssignByte/c.exe test/bin/PreNot/c.exe test/bin/Basic/c.exe test/bin/OpPostIncWhile/c.exe test/bin/ObjectFieldArrayStg/c.exe test/bin/ConstArrayNoLen/cpp.exe test/bin/OpEqualNum/c.exe test/bin/StContinueWhile/c.exe test/bin/MethodBase/c.exe test/bin/LibMathAsin/c.exe test/bin/ArrayStgInitField/c.exe test/bin/OpGreaterOrEqual/c.exe test/bin/OpPreIncWhile/c.exe test/bin/LibMathLog2/c.exe test/bin/StForRangeDec/c.exe test/bin/ClassForwardBase/c.exe test/bin/LexLiteralChar/c.exe test/bin/LibMathCosh/c.exe test/bin/StringStgInitPtr/c.exe test/bin/ArrayLength/c.exe test/bin/ConstLocalMany/cpp.exe test/bin/Doc/cpp.exe test/bin/ClassForwardStg/cpp.exe test/bin/PreElse/c.exe test/bin/DynamicInit/c.exe test/bin/LexCommentMultiLine/c.exe test/bin/ConstDouble/c.exe test/bin/StDoWhile/c.exe test/bin/OpNotEqualNum/c.exe test/bin/PreElif/c.exe test/bin/OpGreater/c.exe test/bin/OpAssignChained/c.exe test/bin/OpPostIncFor/c.exe test/bin/StThrow/c.exe test/bin/LibMathE/c.exe test/bin/FloatToInt/c.exe test/bin/LibMathPow/c.exe test/bin/ClassForwardBase/cpp.exe test/bin/ObjectConstructorGrand/c.exe test/bin/ObjectPtrToStg/c.exe test/bin/OpDivInt/c.exe test/bin/StSwitchEnum/c.exe test/bin/MethodVirtualThrows/c.exe test/bin/OpOr/c.exe test/bin/ConstBool/c.exe test/bin/ByteArray/cpp.exe test/bin/OpAddAssignString/c.exe test/bin/MethodSealed/c.exe test/bin/ArrayStgMultiDim/c.exe test/bin/OpSub/c.exe test/bin/ConstInt/cpp.exe test/bin/LibConsoleWriteLine/c.exe test/bin/OpIndexArrayPtr/c.exe test/bin/StContinueFor/c.exe test/bin/OpLess/c.exe test/bin/IntUnsigned/c.exe test/bin/ArrayStgStringStg/c.exe test/bin/ConstString/c.exe test/bin/ArrayStgMultiDim/cpp.exe test/bin/StReturnDynamic/c.exe test/bin/StIf/c.exe test/bin/MethodStatic/c.exe test/bin/OpCondAnd/c.exe test/bin/LibMathSqrt/c.exe test/bin/ClassForwardPtr/c.exe test/bin/StReturnStringStg/c.exe test/bin/LibMathCbrt/c.exe test/bin/OpPreDecDoWhile/c.exe test/bin/ConstDouble/cpp.exe test/bin/LibMathLog/c.exe test/bin/ArrayStgStringStg/cpp.exe test/bin/LibMathTruncate/c.exe test/bin/PreParentheses/c.exe test/bin/ArrayLength/cpp.exe test/bin/ArrayFill/cpp.exe test/bin/MethodParamDefault/c.exe test/bin/ObjectPtrToBase/c.exe test/bin/OpPreDec/c.exe test/bin/LexLiteralDouble/c.exe test/bin/LibConsoleErrorWrite/c.exe test/bin/PreUndefined/c.exe test/bin/OpMul/c.exe test/bin/StringLastIndexOf/c.exe test/bin/LibMathAtan2/c.exe test/bin/ConstString/cpp.exe test/bin/StNative/c.exe test/bin/LibMathFusedMultiplyAdd/c.exe test/bin/Float/c.exe test/bin/PreOr/c.exe test/bin/StBreakSwitch/c.exe test/bin/OpPreInc/c.exe test/bin/StringSubstringZero/c.exe test/bin/ConstStringInterpolated/c.exe test/bin/MethodAbstract/c.exe test/bin/StWhile/c.exe test/bin/OpIndexString/c.exe test/bin/StForRangeStep/c.exe test/bin/OpPostDec/c.exe test/bin/ConstLong/c.exe test/bin/OpNotEqualNull/c.exe test/bin/MethodThis/c.exe test/bin/StElseIf/c.exe test/bin/Doc/c.exe test/bin/Enum/c.exe test/bin/LibMathSin/c.exe test/bin/ConstStringInterpolated/cpp.exe test/bin/OpShiftLeft/c.exe test/bin/StringContains/c.exe test/bin/ConstLong/cpp.exe test/bin/ConstArrayInt/c.exe test/bin/OpEqualString/c.exe test/bin/ArrayPtrMultiDim/c.exe test/bin/MethodProtected/c.exe test/bin/OpNotEqualArrayPtr/c.exe test/bin/StBreakWhile/c.exe test/bin/StForNotRange/c.exe test/bin/Range/c.exe test/bin/StFor/c.exe test/bin/MethodVirtual/c.exe test/bin/LexGolf/c.exe test/bin/OpAddNum/c.exe test/bin/OpPostIncIf/c.exe test/bin/StringStartsWith/c.exe test/bin/StringStg/c.exe test/bin/OpDivAssignInt/c.exe test/bin/OpEqualObjectPtr/c.exe test/bin/PreAnd/c.exe test/bin/LibMathInfinity/c.exe test/bin/OpAnd/c.exe test/bin/DynamicArrayMultiDim/c.exe test/bin/StringLength/c.exe test/bin/LibMathExp/c.exe

[Feature request] return object storage by value

After what I described in #8, I thought maybe it would be possible to return an object storage:

  public static Length() Create(double value, LengthUnit unit) {
    Length() length;
    length.Set(value, unit);
    return length;
  }

But it causes this compiler error, which seems contradictory:

src/length.ci(23): ERROR: Cannot coerce Length() to Length()

However cito supports assigning one object storage to another:

    Length() length;
    Length() length2;
    length = length2; // no errors, output C++ is okay

Would it be possible for cito to support this by returning by value in C++?

Length Length::create(double value, LengthUnit unit)
{
	Length length;
	length.set(value, unit);
	return length;
}

And return a reference in other languages like JS?

create(value, unit) {
  const length = new Length();
  length.set(value, unit);
  return length;
}

I could make the C++ API much more convenient if I could have these static methods that return by value instead of returning shared pointers, or constructing and then initializing.

Access to private member

It compiles without errors, could You check it?

public class Apartment
{
    Person p;
}

public class Person
{
    Apartment a;
}

public static class Program
{	
    static void Main()
    {
        Apartment# a = new Apartment();
        Person# p = new Person();
        a.p = p; //<------------------------------- should be Error, p is private!
        p.a = a;
        a = null; //do nothing
        p = null; //should be both released
    }
}

How to use existing C struct as a base?

I'm writing Midnight Commander fork. I thought that I could use cito to make it easier and cleaner. However, how could I use an existing C struct, like WDialog, as a base of a new class? In general, how to include the headers of existing C project?

UTF-8 BOM documentation

cito accepts source files with and without the UTF-8 BOM.
The doc currently recommends using them, because that makes the UTF-8 encoding explicit, which helps many tools, especially on Windows.
There are pros and cons of the BOM which can be discussed here.

Read-only/read-write references induce dangling pointers in C and C++?

I believe that "reference" in the docs is used in Java/C# sense, not in C++ sense: you can use them with no fear of accessing deleted object.

Consider the following code (feel free to close it if it's incorrect):

class Foo {
	int data;
	Foo ref;
}
public static class Test
{
	public static void Run()
	{
		Foo# a = new Foo();
		{
			Foo# b = new Foo();
			a.ref = b;
		}  // (!)
		Console.Write(a.ref.data);
	}
}

it gets compiled to the following C++ code:

class Foo
{
public:
	Foo() = default;
private:
	int data;
	const Foo * ref;
};

void Test::run()
{
	std::shared_ptr<Foo> a = std::make_shared<Foo>();
	{
		std::shared_ptr<Foo> b = std::make_shared<Foo>();
		a->ref = b.get();
	}
	std::cout << a->ref->data;
}

and the following C code:

struct Foo {
	int data;
	const Foo *ref;
};

void Test_Run(void)
{
	Foo *a = (Foo *) CiShared_Make(1, sizeof(Foo), NULL, NULL);
	{
		Foo *b = (Foo *) CiShared_Make(1, sizeof(Foo), NULL, NULL);
		a->ref = b;
		CiShared_Release(b);
	}
	printf("%d", a->ref->data);
	CiShared_Release(a);
}

In both cases, Foo *b is destroyed at the (!) mark and a.ref.data now points to a destroyed object, so it is undefined behavior. Java version works as expected: b is preserved until it's no longer used.

So it looks like there are very different semantics for read-only references in different output languages. Unfortunately, there is no way to fully solve this problem without writing your own garbage collector for C and C++ as there may be cyclic references.

However, if cyclic references are prohibited, making read-only references counted should help. I believe similar problem exists with read-write object references.

The name is very bad

On a US keyboard, "Ć" is hard to type, and therefore both hard to talk about and hard to search for. I think this project will get more attention and use if the name is changed.

May I suggest:

  • C' or "C Prime"
  • C* or "C Star"
  • Ci

void function returns false if throws

public class CanThrow { public static void WillThrow(int a) { if (a<15){throw "a<15";} Console.WriteLine(a); } }

compiles into
void CanThrow_WillThrow(int a) { if (a < 15) { return false; } printf("%d\n", a); }

Test framework and testing solution for cito

Hi! I love your idea for a language specifically designed to be transpiled to other languages! I myself code with multiple langauges and always missed the option like this.

However, I find it stupidly absent that there's no solution for testing your application in Ć so far, for me, I could start using it right now, but I use TDD for 8 years now, and that's a big deal braker for me.

I find it necessary for two reasons.

  • First, I would like to code just in Ć, and write tests for my code in Ć, just for the sake of them - this is a must have IMO.
  • Second of all, when you transpile Ć language to Java/PHP, you could also transpile tests from ĆTest to jUnit or phpUnit. This is open for discussion, since the choosing of testing library can be subjective (for example for python unittest vs pytest will be hard to choose).

I could help you develop such a solution or code it, since I know all the supported languages (c#, java, php, python and c).

7 ideas to improve ci (in my opinion)

First of all, I want to tell you that this is best language I saw.

  1. Using break in switches.
    I have quite big experience working with custom programming languages and can assure that leaving break as default behavior of each case lead to much easier and readable code.
    switch (someValue) {
    case 1: DoFoo();
    case 2: DoBar();
    case 3, 4, 5: DoCar();
    case 6..9: DoSomethingSmart();
    }
    Some useful thing could be automatically generated default: assert false, “switch someEnum unsupported case 10”. If I don’t want to have assert, I’d just add default: ;. I guess 99% of all switches had expected behavior to cover all cases.

  2. Using one line declarations
    int a, b, c; // syntax error
    It is very handy when working with big scripts, projects with lot of logic and complex algorithms. I’d recommend to leave this behavior or move it to some codestyle settings.

  3. in keyword (this is minor idea)
    foreach ((string k, int v) in dict)
    using : as alternative to in keyword

foreach (Item item : ItemsList) or even
foreach (item : ItemsList)
where item type is type of Lists elements

First one is also very good.

  1. WriteLine is used 99% more often than Write in my experience. Having Write() for WriteLine is more simplier, while making some other name for case when we don’t want to break line.

  2. Having some kind of sugar for easier properties. Closer to c#.
    class member
    int width;
    int GetWidth() { return width; };
    void SetWidth(int value) { width = value; };

allow to use something similar to
int width; {get; set;}
int width; {public GetWidth() : get; public SetWidth(int value) : set}

int height;
public int GetHeight() : get height;
public int SetHeight(int value) : set height;

keywords get set to generate default code.

Personally I think => sugar syntax isn’t beautiful and doesn’t work for Setters.

  1. Fill memory with nulls for uninitialize variables;
    This can be useful and make code clearer from my experience.
    String() someString; // ==“” when read
    float countOfEvenInArray;

    countOfEvenInArray++;

  2. Idea of having codestyle defines.
    Allowing to have one rule inside one project but different rules for different teams and codestyle guides.
    e.g. if some team prefer to use ? optional or having break; as default case behavior they can put it into cicode.config file
    UseBreakAsDefaultForSwitchCases = true;
    AllowGettersSugar = false;
    UseStrictSpaceIntendation = false; // true for python guys
    NullifyDeclarations = true;
    And so on…

Yes, it has negative side that ci code starts to work/feel little different; but it will be still compatible if user specifies code file codestyle.

e.g.
using projectxcodestyle.config; at the start of the code;

positive side is that each team can tailor your language to their needs and individual case.

Codestyle rules should be very limited and cherry-picked, but having default break on switch and one line var declaration is very handy;

Just wanted to share my thoughts, cause I like what you are doing.

C target returns pointer to freed memory

I was curious how it deals with strings when targeting pure C, so I tested with:

protected string Batata!() {
	string name = "John";
	int born = 1979;
	int now = 2019;
	string() s = $"{name} is {now - born} years old";
	return s;
}

And it compiled to:

static const char *ImageDecoder_Batata(ImageDecoder *self)
{
    const char *name = "John";
    int born = 1979;
    int now = 2019;
    char *s = CiString_Format("%s is %d years old", name, now - born);
    const char *returnValue = s;
    free(s);
    return returnValue;
}

returnValue is a pointer to s that was just freed

Keyword mut instead opposite keyword const

For concurrency preferable are immutable fields, these should be default, only mutable will have keyword mut. In Pony concurrency model, immutable fields can be fine shared between actors, only mutable require asynchronous messages.

[Discussion] string encoding

Hi there, Ć looks awesome and I really want to use it but for some of my use cases (file parsing) dealing with string encoding would be hard...

I'm not experienced in working with unicode string encodings in C/C++ and I don't know if you are either, but have you had any thoughts about what it would take to make Ć strings unicode (or maybe a pragma to turn on unicode strings)?

It's something I might look into contributing if you're open to it and would like to give me tips on working with the codebase.
In a quest to make cross-language APIs I've determined that Haxe definitely won't work, and SWIG/Emscripten seem like they would be workable, but a huge hassle compared to if I could use Ć.

returning readonly reference

I've got this method (want to use an immutable object pattern, not concerned about max performance):

  public static Length Create(double value, LengthUnit unit) {
    Length length = new Length();
    length.Set(value, unit);
    return length;
  }

I think this output C++ code leaks memory? I'm not an expert in C++ but I don't see a way that the shared pointer could be released:

const Length * Length::create(double value, LengthUnit unit)
{
	const Length * length = std::make_shared<Length>().get();
	length->set(value, unit);
	return length;
}

Example project?

Is there an existing project written in Ć? I had been interested in this for a library that I had wanted to write, but there are no examples other than the trivial "hello world" and the tests in this repo that I've found.

abstract methods in GenBase and generating declaration files

This is just a note...
I'm looking at writing a TypeScript declaration file generator.

I noticed that GenBase has a bunch of abstract methods like WriteNewArray, WriteListStorageInit, WriteCall etc. Since TypeScript declaration files don't contain method implementations, a GenTsDecls class would have to implement these methods as no-ops. Not a huge deal, but what do you think, should we extract an interface from GenBase so that GenTsDecls and anything like it (I also use Flowtype for some JS projects 🙃) doesn't have to implement a bunch of irrelevant abstract methods?

Unknown preprocessor directive

I have this code, it runs as intended but when compiling it to javascript it shows Error "wlcreator.c(6): ERROR: Unknown preprocessor directive"

I am using this command

./cito -l js -o wlcreator.js wlcreator.c

I am On XUbuntu 20.04 LTS

Integer data types, signednes, width

While reading the spec I noticed that the choices for the integer data types are kinda weird and I'd suggest following the route C has gone with the stdint.h types.

And even though most people in C, C++, C#, and Java may be used to using int and long: I'd suggest to deprecate those two types as at least with C and C++ you are producing unportable code when naively using those types as the sizes of those types differ across platforms (hence the suggestion to be explicit with integer sizes).

Furthermore your spec notes that explicit integer ranges like 0..100 foo; are not enforced: If they aren't enforced this makes little sense and might even cause confusion when your compiler decides to use a different underlaying data type than what the programmer expects.

Grammar railroad diagram

After going through the CiParser.cs and writing an LL(1) grammar with a modified https://github.com/mingodad/CocoR-CSharp I've got it to generate an EBNF understood by https://www.bottlecaps.de/rr/ui to generate railroad diagram (https://en.wikipedia.org/wiki/Syntax_diagram).

Copy the EBNF shown bellow and paste on https://www.bottlecaps.de/rr/ui in the tab Edit Grammar then switch to the tab View Diagram :

//
// EBNF generated by CocoR parser generator to be viewed with https://www.bottlecaps.de/rr/ui
//

//
// productions
//

Cito ::=  stmt* EOF
stmt ::=  ParseDoc? Public? ( ParseClass | ParseEnum | ParseNative )
ParseDoc ::=  DocComment ParseCodeDoc
ParseClass ::=  ( Static | Abstract | Sealed )? Class ParseId ( Colon ParseId )? LeftBrace ( ParseDoc? CiVisibility? ( ParseConst | ParseCallType? ( Void ParseClassMember | ParseType ( ParseBlock | ParseClassMember ) ) ) )* RightBrace
ParseEnum ::=  Enum Asterisk? ParseId LeftBrace EnumElement ( Comma EnumElement )* RightBrace
ParseNative ::=  Native LeftBrace RightBrace
ParseCodeDoc ::=  ParsePara ( Dot ParseBlock* )?
ParsePara ::=  ParseText ( CodeDelimiter ParseText )*
ParseBlock ::=  LeftBrace ParseStatement* RightBrace
ParseText ::=  ANY
ParseId ::=  ident
CiVisibility ::=  Internal | Protected | Public | Private
ParseConst ::=  Const ParseType ParseId Assign ParseConstInitializer Semicolon
ParseCallType ::=  Static | Abstract | Virtual | Override | Sealed
ParseClassMember ::=  ParseId ( ParseMethod | ( Assign ParseExpr )? Semicolon )
ParseType ::=  ParseExpr ( Range ParseExpr )?
ParseMethod ::=  ExclamationMark? LeftParenthesis ( MethodParameter ( Comma MethodParameter )* )? RightParenthesis Throws? ( Semicolon | FatArrow ParseReturnExpr | ParseBlock )
ParseExpr ::=  ParseCondOrExpr ( QuestionMark ParseExpr Colon ParseExpr )?
ParseConstInitializer ::=  LeftBrace ParseCollection? RightBrace | ParseExpr
ParseCollection ::=  ParseExpr ( Comma ParseExpr )*
MethodParameter ::=  ParseDoc? ParseVarType
ParseReturnExpr ::=  ParseExpr? Semicolon
ParseVarType ::=  ParseType ParseVarAssign
ParseVarAssign ::=  ParseId ( Assign ParseAssign )?
ParseAssign ::=  ParseType ( ( Assign | AddAssign | SubAssign | MulAssign | DivAssign | ModAssign | AndAssign | OrAssign | XorAssign | ShiftLeftAssign | ShiftRightAssign ) ParseAssign | ParseVarAssign )?
EnumElement ::=  ParseDoc? ParseId ( Assign ParseExpr )?
ParseStatement ::=  ParseBlock | ParseAssert | ParseBreak | ParseConst | ParseContinue | ParseDoWhile | ParseFor | ParseForeach | ParseIf | ParseLock | ParseNative | ParseReturn | ParseSwitch | ParseThrow | ParseWhile | ParseAssign Semicolon
ParseAssert ::=  Assert ParseExpr ( Comma ParseExpr )? Semicolon
ParseBreak ::=  Break Semicolon
ParseContinue ::=  Continue Semicolon
ParseDoWhile ::=  Do ParseLoopBody While ParseParenthesized Semicolon
ParseFor ::=  For LeftParenthesis ParseAssign? Semicolon ParseExpr? Semicolon ParseAssign? RightParenthesis ParseLoopBody
ParseForeach ::=  Foreach LeftParenthesis ( LeftParenthesis ParseForeachIterator Comma ParseForeachIterator RightParenthesis | ParseForeachIterator ) In ParseExpr RightParenthesis ParseLoopBody
ParseIf ::=  If ParseParenthesized ParseStatement ( Else ParseStatement )?
ParseLock ::=  Lock ParseParenthesized ParseStatement
ParseReturn ::=  Return ParseReturnExpr
ParseSwitch ::=  Switch ParseParenthesized LeftBrace ParseCaseStatement* ( Default Colon ParseStatement* )? RightBrace
ParseThrow ::=  Throw ParseExpr Semicolon
ParseWhile ::=  While ParseParenthesized ParseLoopBody
ParseLoopBody ::=  ParseStatement
ParseParenthesized ::=  LeftParenthesis ParseExpr RightParenthesis
ParseForeachIterator ::=  ParseType ParseId
ParseCaseStatement ::=  ParseCase ParseCase* ParseStatement*
ParseCase ::=  Case ParseExpr Colon
ParseCondOrExpr ::=  ParseCondAndExpr ( CondOr ParseCondAndExpr )*
ParseCondAndExpr ::=  ParseOrExpr ( CondAnd ParseOrExpr )*
ParseOrExpr ::=  ParseXorExpr ( Or ParseXorExpr )*
ParseXorExpr ::=  ParseAndExpr ( Xor ParseAndExpr )*
ParseAndExpr ::=  ParseEqualityExpr ( And ParseEqualityExpr )*
ParseEqualityExpr ::=  ParseRelExpr ( ( Equal | NotEqual ) ParseRelExpr )*
ParseRelExpr ::=  ParseShiftExpr ( ( Less | LessOrEqual | Greater | GreaterOrEqual ) ParseShiftExpr | Is ParsePrimaryExpr ParseId? )*
ParseShiftExpr ::=  ParseAddExpr ( ( ShiftLeft | ShiftRight ) ParseAddExpr )*
ParsePrimaryExpr ::=  ( Increment | Decrement | Minus | Tilde | ExclamationMark | New ) ParsePrimaryExpr | ( Literal | ParseInterpolatedString | LeftParenthesis ParseType RightParenthesis | ParseSymbolReference | ParseListType | ParseDictionaryType | Resource Less BYTE LeftBracket RightBracket Greater ParseParenthesized ) ( Dot ParseSymbolReference | LeftParenthesis ParseCollection? RightParenthesis | LeftBracket ParseExpr? RightBracket | ( Increment | Decrement | ExclamationMark | Hash ) )*
ParseAddExpr ::=  ParseMulExpr ( ( Plus | Minus ) ParseMulExpr )*
ParseMulExpr ::=  ParsePrimaryExpr ( ( Asterisk | Slash | Mod ) ParsePrimaryExpr )*
Literal ::=  intcon | floatcon | string | charcon | BoxedFalse | BoxedTrue | BoxedNull
ParseInterpolatedString ::=  interpolatedstring
ParseSymbolReference ::=  ParseId
ParseListType ::=  List Less ParseTypeTemplate Greater
ParseDictionaryType ::=  ( Dictionary | SortedDictionary ) Less ParseTypeTemplate Comma ParseTypeTemplate Greater
ParseTypeTemplate ::=  ParsePrimaryExpr

//
// tokens
//

Abstract ::= "abstract"
AddAssign ::= "+="
And ::= "&"
AndAssign ::= "&="
Assert ::= "assert"
Assign ::= "="
Asterisk ::= "*"
Break ::= "break"
Case ::= "case"
Class ::= "class"
CodeDelimiter ::= "`"
Colon ::= ":"
Comma ::= ","
CondAnd ::= "&&"
CondOr ::= "||"
Const ::= "const"
Continue ::= "continue"
Decrement ::= "--"
Default ::= "default"
Dictionary ::= "Dictionary"
DivAssign ::= "/="
DocComment ::= "///"
Do ::= "do"
Dot ::= "."
Else ::= "else"
Enum ::= "enum"
Equal ::= "=="
ExclamationMark ::= "!"
FatArrow ::= "=>"
Foreach ::= "foreach"
For ::= "for"
Greater ::= ">"
GreaterOrEqual ::= ">="
Hash ::= "#"
If ::= "if"
Increment ::= "++"
In ::= "in"
Internal ::= "internal"
Is ::= "is"
LeftBrace ::= "{"
LeftBracket ::= "["
LeftParenthesis ::= "("
Less ::= "<"
LessOrEqual ::= "<="
List ::= "List"
Lock ::= "lock"
Minus ::= "-"
Mod ::= "%"
ModAssign ::= "%="
MulAssign ::= "*="
Native ::= "native"
New ::= "new"
NotEqual ::= "!="
Or ::= "|"
OrAssign ::= "|="
Override ::= "override"
Plus ::= "+"
Protected ::= "protected"
Public ::= "public"
QuestionMark ::= "?"
Range ::= ".."
Resource ::= "resource"
Return ::= "return"
RightBrace ::= "}"
RightBracket ::= "]"
RightParenthesis ::= ")"
Sealed ::= "sealed"
Semicolon ::= ";"
ShiftLeft ::= "<<"
ShiftLeftAssign ::= "<<="
ShiftRight ::= ">>"
ShiftRightAssign ::= ">>="
Slash ::= "/"
SortedDictionary ::= "SortedDictionary"
Static ::= "static"
SubAssign ::= "-="
Switch ::= "switch"
Throw ::= "throw"
Throws ::= "throws"
Tilde ::= "~"
Virtual ::= "virtual"
Void ::= "void"
While ::= "while"
Xor ::= "^"
XorAssign ::= "^="
BoxedFalse ::= "false"
BoxedTrue ::= "true"
BoxedNull ::= "null"
BYTE ::= "byte"
Private ::= "private"

This grammar deviates a bit from the code flow on CiParser.cs but I think is good enough to give a global overview of Cito grammar
actually it recognizes almost all of test/*.ci:


COMPILER Cito

TERMINALS
	T_SYMBOL

CHARACTERS
	letter    = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_".
	oct        = '0'..'7'.
	digit     = "0123456789".
	nzdigit    = '1'..'9'.
	cr        = '\r'.
	lf        = '\n'.
	tab       = '\t'.
	stringCh  = ANY - '"' - '\\' - cr - lf.
	charCh    = ANY - '\'' - '\\' - cr - lf.
	printable = '\u0020' .. '\u007e'.
	hex       = "0123456789abcdefABCDEF".

	newLine   = cr + lf.
	notNewLine = ANY - newLine .
	ws         = " " + tab + '\u000b' + '\u000c'.

TOKENS
	ident     = letter { letter | digit }.
	floatcon = ( '.' digit {digit} [('e'|'E')  ['+'|'-'] digit {digit}]
		| digit {digit} '.' {digit} [('e'|'E')  ['+'|'-'] digit {digit}]
		| digit {digit} ('e'|'E')  ['+'|'-'] digit {digit}
		) ['f'|'l'|'F'|'L'].

	intcon   = ( nzdigit {digit}
		| '0' {oct}
		| ("0x"|"0X") hex {hex}
		) {'u'|'U'|'l'|'L'}.

	string    = '"' { stringCh | '\\' printable } '"'.
	interpolatedstring    = "$\"" { stringCh | '\\' printable } '"'.
	badString = '"' { stringCh | '\\' printable } (cr | lf).
	charcon      = '\'' ( charCh | '\\' printable { hex } ) '\''.

	Abstract = "abstract" .
	AddAssign = "+=" .
	And = "&" .
	AndAssign = "&=" .
	Assert = "assert" .
	Assign = "=" .
	Asterisk = "*" .
	Break = "break" .
	Case = "case" .
	Class = "class" .
	CodeDelimiter = "`" .
	Colon = ":" .
	Comma = "," .
	CondAnd = "&&" .
	CondOr = "||" .
	Const = "const" .
	Continue = "continue" .
	Decrement = "--" .
	Default = "default" .
	Dictionary = "Dictionary" .
	DivAssign = "/=".
	DocComment = "///" .
	Do = "do" .
	Dot = "." .
	Else = "else" .
	Enum = "enum" .
	Equal = "==" .
	ExclamationMark = "!" .
	FatArrow = "=>" .
	Foreach = "foreach" .
	For = "for" .
	Greater = ">" .
	GreaterOrEqual = ">=" .
	Hash = "#" .
	If = "if" .
	Increment = "++" .
	In = "in" .
	Internal = "internal" .
	Is = "is" .
	LeftBrace = "{" .
	LeftBracket = "[" .
	LeftParenthesis = "(" .
	Less = "<" .
	LessOrEqual = "<=" .
	List = "List" .
	Lock = "lock" .
	Minus = "-" .
	Mod = "%" .
	ModAssign = "%=" .
	MulAssign = "*=" .
	Native = "native" .
	New = "new" .
	NotEqual = "!=" .
	Or = "|" .
	OrAssign = "|=" .
	Override = "override" .
	Plus = "+" .
	Protected = "protected" .
	Public = "public" .
	QuestionMark = "?" .
	Range = ".." .
	Resource = "resource" .
	Return = "return" .
	//RightAngle = ">" .
	RightBrace = "}" .
	RightBracket = "]" .
	RightParenthesis = ")" .
	Sealed = "sealed" .
	Semicolon  = ";" .
	ShiftLeft = "<<" .
	ShiftLeftAssign = "<<=" .
	ShiftRight = ">>" .
	ShiftRightAssign = ">>=" .
	Slash = "/" .
	SortedDictionary = "SortedDictionary" .
	Static = "static" .
	SubAssign = "-=" .
	Switch = "switch" .
	Throw = "throw" .
	Throws = "throws" .
	Tilde = "~" .
	Virtual = "virtual" .
	Void = "void" .
	While = "while" .
	Xor = "^" .
	XorAssign = "^=" .

	BoxedFalse = "false" .
	BoxedTrue = "true" .
	BoxedNull = "null" .

	BYTE : ident = "byte" .
	Private : ident = "private" .

PRAGMAS
	PreIf = "#if" {notNewLine} newLine.
	PreElIf = "#elif" {notNewLine} newLine.
	PreElse = "#else" {notNewLine} newLine.
	PreEndIf = "#endif" {notNewLine} newLine.

	COMMENTS FROM "/*" TO "*/" NESTED
	COMMENTS FROM "//" TO lf

IGNORE cr + lf + tab

/*-------------------------------------------------------------------------*/

PRODUCTIONS

Cito =
	{stmt}
	EOF
	.

stmt =
	[ParseDoc]
	["public"] (
		ParseClass
		| ParseEnum
		| ParseNative
	)
	.

ParseDoc =
	DocComment ParseCodeDoc
	.

ParseCodeDoc =
	ParsePara ['.' {ParseBlock}]
	.

ParsePara =
	ParseText {CodeDelimiter ParseText}
	.

ParseClass =
	[Static | Abstract | Sealed]
		Class ParseId [Colon ParseId]
		LeftBrace
		{
			[ParseDoc]
			[CiVisibility] (
				ParseConst
				| [ParseCallType] (
					Void ParseClassMember
					| ParseType (
						ParseBlock //Constructor
						| ParseClassMember
						)
					)
			)
		}
		RightBrace
	.

ParseClassMember =
	ParseId (
		ParseMethod
		| [Assign ParseExpr] Semicolon
	)
	.

CiVisibility =
	Internal
	| Protected
	| Public
	| Private
	.

ParseConst =
	Const ParseType ParseId Assign ParseConstInitializer Semicolon
	.

ParseConstInitializer =
	LeftBrace [ParseCollection] RightBrace
	| ParseExpr
	.

ParseType =
	ParseExpr [Range ParseExpr]
	.

ParseCallType =
	Static
	| Abstract
	| Virtual
	| Override
	| Sealed
	.

ParseMethod =
	[ExclamationMark]
		LeftParenthesis
			[MethodParameter { Comma MethodParameter }]
		RightParenthesis [Throws]
		(
			Semicolon
			| FatArrow ParseReturnExpr
			| ParseBlock
		)
	.

MethodParameter =
	[ParseDoc] ParseVarType
	.

ParseVarType =
	ParseType ParseVarAssign
	.

ParseVarAssign =
	ParseId [Assign ParseAssign]
	.

ParseAssign =
	ParseType [
		(
			Assign
			| AddAssign
			| SubAssign
			| MulAssign
			| DivAssign
			| ModAssign
			| AndAssign
			| OrAssign
			| XorAssign
			| ShiftLeftAssign
			| ShiftRightAssign
		) ParseAssign
		| ParseVarAssign
	]
	.

ParseEnum =
	Enum [Asterisk] ParseId LeftBrace EnumElement {',' EnumElement} RightBrace
	.

EnumElement =
	[ParseDoc] ParseId [Assign ParseExpr]
	.

ParseBlock =
	LeftBrace {ParseStatement} RightBrace
	.

ParseStatement =
	ParseBlock
	| ParseAssert
	| ParseBreak
	| ParseConst
	| ParseContinue
	| ParseDoWhile
	| ParseFor
	| ParseForeach
	| ParseIf
	| ParseLock
	| ParseNative
	| ParseReturn
	| ParseSwitch
	| ParseThrow
	| ParseWhile
	| ParseAssign Semicolon
	.

ParseAssert =
	Assert ParseExpr [Comma ParseExpr] Semicolon
	.

ParseBreak =
	Break Semicolon
	.

ParseContinue =
	Continue Semicolon
	.

ParseLoopBody =
	ParseStatement
	.

ParseDoWhile =
	Do ParseLoopBody While ParseParenthesized Semicolon
	.

ParseFor =
	For LeftParenthesis
			[ParseAssign] Semicolon [ParseExpr] Semicolon [ParseAssign]
		RightParenthesis ParseLoopBody
	.

ParseForeachIterator =
	ParseType ParseId
	.

ParseForeach =
	Foreach LeftParenthesis (
		LeftParenthesis ParseForeachIterator Comma ParseForeachIterator RightParenthesis
		| ParseForeachIterator
		) In ParseExpr RightParenthesis ParseLoopBody
	.

ParseIf =
	If ParseParenthesized ParseStatement [Else ParseStatement]
	.

ParseLock =
	Lock ParseParenthesized ParseStatement
	.

ParseNative =
	Native LeftBrace (. SkipNested(_LeftBrace, _RightBrace); .) RightBrace
	.

ParseReturn =
	Return ParseReturnExpr
	.

ParseReturnExpr =
	[ParseExpr] Semicolon
	.

ParseSwitch =
	Switch ParseParenthesized LeftBrace {ParseCaseStatement} [Default Colon {ParseStatement}] RightBrace
	.

ParseCaseStatement =
	ParseCase {ParseCase} {ParseStatement}
	.

ParseCase =
	Case ParseExpr Colon
	.

ParseThrow =
	Throw ParseExpr Semicolon
	.

ParseWhile =
	While ParseParenthesized ParseLoopBody
	.

ParseParenthesized =
	LeftParenthesis ParseExpr RightParenthesis
	.

ParseExpr =
	ParseCondOrExpr [QuestionMark ParseExpr Colon ParseExpr]
	.

ParseCondOrExpr =
	ParseCondAndExpr {CondOr ParseCondAndExpr }
	.

ParseCondAndExpr =
	ParseOrExpr {CondAnd ParseOrExpr}
	.

ParseOrExpr =
	ParseXorExpr {Or ParseXorExpr}
	.

ParseXorExpr =
	ParseAndExpr {Xor ParseAndExpr}
	.

ParseAndExpr =
	ParseEqualityExpr {And ParseEqualityExpr}
	.

ParseEqualityExpr =
	ParseRelExpr {(Equal | NotEqual) ParseRelExpr}
	.

ParseRelExpr =
	ParseShiftExpr {
		(Less | LessOrEqual | Greater | GreaterOrEqual) ParseShiftExpr
		| Is ParsePrimaryExpr [ParseId]
		}
	.

ParseShiftExpr =
	ParseAddExpr {(ShiftLeft | ShiftRight) ParseAddExpr}
	.

ParseAddExpr =
	ParseMulExpr {(Plus | Minus) ParseMulExpr}
	.

ParseMulExpr =
	ParsePrimaryExpr {(Asterisk | Slash | Mod) ParsePrimaryExpr}
	.

ParsePrimaryExpr =
	(Increment | Decrement | Minus | Tilde | ExclamationMark | New) ParsePrimaryExpr
	| (
		Literal
		| ParseInterpolatedString
		| LeftParenthesis ParseType RightParenthesis
		| ParseSymbolReference
		| ParseListType
		| ParseDictionaryType
		| Resource Less BYTE LeftBracket RightBracket Greater ParseParenthesized
	) {
		Dot ParseSymbolReference
		| LeftParenthesis [ParseCollection] RightParenthesis
		| LeftBracket [ParseExpr] RightBracket
		| (Increment | Decrement | ExclamationMark | Hash)
	}
	.

/*
CheckXcrementParent =
	(Increment | Decrement) ParsePrimaryExpr
	.
*/
ParseInterpolatedString =
	interpolatedstring //InterpolatedString ParseExpr [Comma ParseExpr] [Colon Number] "\"$"//RightBrace
	.

ParseDictionaryType =
	(Dictionary | SortedDictionary) Less ParseTypeTemplate Comma ParseTypeTemplate Greater
	.

ParseListType =
	List Less ParseTypeTemplate Greater
	.

ParseTypeTemplate =
	ParsePrimaryExpr
	.

ParseSymbolReference =
	ParseId
	.

ParseId =
	ident
	.

ParseCollection =
	ParseExpr {Comma ParseExpr}
	.

ParseText =
	ANY (. SkipTillEOL(); .)
	.

Literal =
	intcon
	| floatcon
	| string
	| charcon
	| BoxedFalse
	| BoxedTrue
	| BoxedNull
	.

END Cito.

Temporary values are not destructed in C, e.g. string interpolation leaks memory

Consider OpAddAssignString.ci:

		s2 += p + $"{p}" + s; //FAIL: cpp - should work with C++20

gets compiled to

	CiString_Assign(&s2, CiString_Format("%s%s%s%s", s2, p, p, s));

here, the result of CiString_Format is a result of malloc. It's passed to CiString_Assign and abandoned afterwards, leaking memory. This does not happen in C++ because temporary values are automatically destructed in C++, including std::string.

I assume there may be other instances where temporary objects are created and not immediately stored into variables.

Negative constant floats give errors

I can't think of any good reason why they wouldn't work but public const float name = -1.0; gives:
.\test.ci(10): ERROR: Value for constant name is not constant.
Non negative values work fine however. This doesn't appear to be target related so might just be a problem with the language. Is this intended?

I tried putting negative values inside an array instead public const float[] name = {-1.0}; and that just made things worse:

Unhandled exception. System.InvalidCastException: Unable to cast object of type 'Foxoft.Ci.CiPrefixExpr' to type 'Foxoft.Ci.CiLiteral'.
at Foxoft.Ci.GenBase.WriteCoercedLiterals(CiType type, CiExpr[] exprs) in {path}\cito-master\GenBase.cs:line 645
at Foxoft.Ci.GenTyped.Visit(CiCollection expr, CiPriority parent) in {path}\cito-master\GenTyped.cs:line 44
at Foxoft.Ci.CiCollection.Accept(CiVisitor visitor, CiPriority parent) in {path}\cito-master\CiTree.cs:line 125
at Foxoft.Ci.GenCs.WriteConsts(IEnumerable`1 consts) in {path}\cito-master\GenCs.cs:line 649
at Foxoft.Ci.GenCs.Write(CiClass klass) in {path}\cito-master\GenCs.cs:line 678
at Foxoft.Ci.GenCs.Write(CiProgram program) in {path}\cito-master\GenCs.cs:line 743
at Foxoft.Ci.CiTo.Main(String[] args) in {path}\cito-master\CiTo.cs:line 155

Precompiled regex

I noticed that the regex examples pass the string pattern on each test, unlike all languages I'm familiar with where regexes are first-class objects that you construct (hence only get compiled once) and can pass around...

There's not any kind of internal cache of compiled regexes is there?

If not I might feel tempted to make a Regex Ć class in userland with a bunch of conditional compilation and extern blocks for each target language.

Generic functions

Is it possible to define generic classes and functions in Ć, like in Java, C#, and C++?

If Ć doesn't have generics yet, then the syntax could be based on C#, like this:

public class GenericClass<T>
{
    //source code goes here
}

importing from other files/packages

The language reference doesn't say anything about importing from one ci file to another, are there any import statements yet?

I'm hoping to be able to use it to make packages that depend on each other. I mostly have experience publishing Node.js packages, but would like to be able to make Maven, Pip, etc. packages (maybe vcpkg for C++, no idea if it's any good...) I know modules differ a lot from one language to another so I wouldn't be surprised if Ć lacks any solution for this yet.

[GenJs] prefer triple-equals ===

I think a lot of JS programmers intentionally avoid == since its behavior is fairly complicated when any coercion is involved. The one exception is x == null is true if x is null or undefined, which is useful enough. === doesn't do any coercion and would work just fine since we're coming from strongly-typed code anyway.

Problem compiling on Ubuntu 20.04

Hello,
When I try to compile this project using GNU Make on Ubuntu 20.04, I get the following:

$ make
dotnet build

Welcome to .NET Core!
---------------------
Learn more about .NET Core: https://aka.ms/dotnet-docs
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs

Telemetry
---------
The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.

Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry

ASP.NET Core
------------
Successfully installed the ASP.NET Core HTTPS Development Certificate.
To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only). For establishing trust on other platforms refer to the platform specific documentation.
For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.
Microsoft (R) Build Engine version 16.2.32702+c4012a063 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 109.45 ms for /home/AEX3/coding/gitProjects/cito/cito.csproj.
/usr/share/dotnet/sdk/2.2.402/Microsoft.Common.CurrentVersion.targets(1175,5): error MSB3644: The reference assemblies for .NETFramework,Version=v5.0 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks [/home/AEX3/coding/gitProjects/cito/cito.csproj]

Build FAILED.

/usr/share/dotnet/sdk/2.2.402/Microsoft.Common.CurrentVersion.targets(1175,5): error MSB3644: The reference assemblies for .NETFramework,Version=v5.0 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks [/home/AEX3/coding/gitProjects/cito/cito.csproj]
    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:01.03
make: *** [Makefile:38: cito.exe] Error 1

NaN/Infinite values

I don't see constants for NaN/Infinity in the language reference, are they supported yet?

SortedDictionary failed

I like the work you have done and really appealing.
As it is mentioned in your tester and I also tested with your mentioned example for foreach the code fail to generate and shows internal C# messages which is misleading.

  • I think in first phase bypass this by showing proper error like line X: SortedDictionary is not supported yet
  • Try to support
    I will spend more time and if I had time I would fix it to have a little contribute

Maybe you can use LLVM?

Have you tried compiling your language to LLVM?

In short, you know how you can compile Java/Kotlin/Scala to JVM byte cote, and it takes care of every architecture?

You can do the same with Cito; if you compile the program into LLVM byte code - you can run the program on any architecutre (86/64, and any OS).

Simple build script

Trying to build this project on Linux I get this error message:

make
dotnet build
Could not execute because the application was not found or a compatible .NET SDK is not installed.
Possible reasons for this include:
  * You intended to execute a .NET program:
      The application 'build' does not exist.
  * You intended to execute a .NET SDK command:
      It was not possible to find any installed .NET SDKs.
      Install a .NET SDK from:
        https://aka.ms/dotnet-download
Makefile:38: recipe for target 'cito.exe' failed
make: *** [cito.exe] Error 145

But using the simple shell script shown bellow it builds fine, I suggest add it or something like it as alternative build system (also could be a batch file for windows).

csc /out:Cito.exe /t:exe \
	AssemblyInfo.cs \
	CiDocLexer.cs \
	CiDocParser.cs \
	CiException.cs \
	CiLexer.cs \
	CiParser.cs \
	CiResolver.cs \
	CiTo.cs \
	CiTree.cs \
	GenBase.cs \
	GenCCpp.cs \
	GenC.cs \
	GenCl.cs \
	GenCpp.cs \
	GenCs.cs \
	GenJava.cs \
	GenJs.cs \
	GenPy.cs \
	GenPySwift.cs \
	GenSwift.cs \
	GenTs.cs \
	GenTyped.cs

Is uninitialized string storage supposed to be allowed?

public class Test
{
	public static bool Run()
	{
		string() foo;
		string() bar;
		return foo.StartsWith(bar);
	}
}

Cito compiles this successfully. In C++ it passes since a std::string declaration is the empty string, but in other languages the variables are null or undefined, and the test fails:

  • C: segfault
  • C++: passes
  • Java: compile error
  • JavaScript: crashes with TypeError
  • Python: crashes with NameError
  • Swift: compile error

[GenJs] still expects 2 arguments to list.Insert

GenCpp allows the second argument to be optional:

		else if (obj.Type is CiListType list2 && method.Name == "Insert") {
			if (method.Parameters.Count == 1) {

GenJs doesn't:

		else if (obj.Type is CiListType && method.Name == "Insert") {
			obj.Accept(this, CiPriority.Primary);
			Write(".splice(");
			args[0].Accept(this, CiPriority.Statement);
			Write(", 0, ");
			args[1].Accept(this, CiPriority.Statement);
			Write(')');

Also it's not documented what it means to omit the second argument.

LibListObjectStg.ci calls with one argument:

		Test! u = list.Insert(0);

I'm getting an array index out of bounds error because of this when I try to test LibListObjectStg.ci on JS or TS.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.