Git Product home page Git Product logo

gymir's Introduction

What is GYMIR ?

GYMIR is a GPL implementation of the Ymir compiler that use the GCC as a back end.

Compilation for local usage and tests

mkdir ${install_dir}/gcc
cd ${install_dir}/gcc
mkdir gcc-src
mkdir gcc-build
mkdir gcc-install

# cloning gcc
git clone --depth=1 git://gcc.gnu.org/git/gcc.git gcc-src
cd ${install_dir}/gcc/gcc-src
git fetch --tags --depth=1
git checkout releases/gcc-{version}

# cloning ymir - master revision
cd ${install_dir}/gcc/gcc-src/gcc
git clone --depth=1 https://github.com/GNU-Ymir/gymir.git ymir

# install deps
cd ${install_dir}/gcc/gcc-src/gcc
./contrib/download_prerequisites

# configure
cd ${install_dir}/gcc/gcc-build
../gcc-src/configure --prefix=${install_dir}/gcc/gcc-build/../gcc-install --enable-languages=c,ymir --disable-bootstrap --disable-multilib

# compile
make
make install

# export path
export PATH=${PATH}:${install_dir}/gcc/gcc-install/bin:.

The compiler is know compiled and ready for debugging. All the source code of ymir are located in ${install_dir}/gcc/gcc-src/gcc/ymir/. Simply running:

cd ${install_dir}/gcc/gcc-build
make
make install

Will update the gyc command.

Warning some modification of ymir (such as ListError.{cc,hh}) may require to recompile every ymir files, the dependencies of compilation in c++ are not totally managed. To remove all precompiled file, and make sure everything is correct, you will have to run :

cd ${install_dir}/gcc/gcc-build
rm gcc/ymir/*.o # remove old object files
make
make install

To be fully usable, you will have to compile the runtime locally Runtime.

Compilation for release

The repository Ymir-CD_suite is the repository used to create releases of gyc.

gymir's People

Contributors

emilecadorel avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

gymir's Issues

Erreur interne compilo sur socket.yr

J'ai voulu ajouter un println dans socket.yr et j'ai l'erreur suivante à la compile :

gyc serverUdp.yr socket.yr -o serverUdp

socket.yr: Dans la fonction «socket.serverUdp.recvFrom»:
socket.yr:210:13: erreur interne du compilateur : dans fold_convert_loc, à fold-const.c:2402
     println ("recv using ", socket, " on ", *srcAddr, " of size : ", addrlen);
             ^
0x9235e4 fold_convert_loc(unsigned int, tree_node*, tree_node*)
        ../../gcc-src/gcc/fold-const.c:2401
0x9c291f gimplify_modify_expr
        ../../gcc-src/gcc/gimplify.c:5577
0x9af63c gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
        ../../gcc-src/gcc/gimplify.c:11434
0x9b2368 gimplify_stmt(tree_node**, gimple**)
        ../../gcc-src/gcc/gimplify.c:6658
0x9adf4b gimplify_statement_list
        ../../gcc-src/gcc/gimplify.c:1767
0x9adf4b gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
        ../../gcc-src/gcc/gimplify.c:11863
0x9b2368 gimplify_stmt(tree_node**, gimple**)
        ../../gcc-src/gcc/gimplify.c:6658
0x9b34b3 gimplify_bind_expr
        ../../gcc-src/gcc/gimplify.c:1335
0x9af532 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
        ../../gcc-src/gcc/gimplify.c:11635
0x9b2368 gimplify_stmt(tree_node**, gimple**)
        ../../gcc-src/gcc/gimplify.c:6658
0x9adf4b gimplify_statement_list
        ../../gcc-src/gcc/gimplify.c:1767
0x9adf4b gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
        ../../gcc-src/gcc/gimplify.c:11863
0x9b2368 gimplify_stmt(tree_node**, gimple**)
        ../../gcc-src/gcc/gimplify.c:6658
0x9b34b3 gimplify_bind_expr
        ../../gcc-src/gcc/gimplify.c:1335
0x9af532 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
        ../../gcc-src/gcc/gimplify.c:11635
0x9b2368 gimplify_stmt(tree_node**, gimple**)
        ../../gcc-src/gcc/gimplify.c:6658
0x9b44ea gimplify_body(tree_node*, bool)
        ../../gcc-src/gcc/gimplify.c:12635
0x9b4bc4 gimplify_function_tree(tree_node*)
        ../../gcc-src/gcc/gimplify.c:12800
0x70202d semantic::IFinalFrame::finalize()
        ../../gcc-src/gcc/ymir/FinalFrame.cc:203
0x7230ab Ymir::Parser::lint_time()
        ../../gcc-src/gcc/ymir/Parser.cc:90
mod socket;

import std.traits;
import core.io;

private mod native {
    public {
        extern (C) socket (addrFamily : int, socketType : int, protocol : int) -> int;
        extern (C) close (fd : int) -> int;
        extern (C) htons (host : ushort) -> ushort;
        extern (C) connect (socket : int, destAddr : p!SockAddr, len : uint) -> int;
        extern (C) inet_addr (const c : p!char) -> uint;
        extern (C) send (sock : int, buf : const p!void, len : const uint, flags : const int) -> int;
        extern (C) sendto (sock : int, buf : const p!void, len : const uint, flags : const int, const destAddr : p!SockAddr, addrlen : uint) -> int;
        extern (C) recv (sock : int, buf : const p!void, len : const uint, flags : const int) -> int;
        extern (C) recvfrom (sock : int, buf : const p!void, len : const uint, flags : const int, sourceAddr : p!SockAddr, addrlen : uint) -> int;
        extern (C) listen (sick : int, backlog : int) -> int;
        extern (C) bind (sock : int, my_addr : p!SockAddr, addrlen : uint) -> int;
        extern (C) accept (sock : int, addr : p!SockAddr, addrlen : p!uint) -> int;
        extern (C) inet_aton (const cp : p!char, inp : p!InAddr) -> int;
    }
}

struct
| handle : int
| addrFamily : AddrFamily
| sockType : SocketType
 -> Socket;

struct
| s_addr : uint
 -> InAddr;

struct
| sin_family : short
| sin_port : ushort
| sin_addr : InAddr
| sin_zero : [char ; 8u]
 -> SockAddrIn;

struct
| sa_family : ushort
| sa_data : [char ; 14u]
 -> SockAddr;

/* Source : socket.h */
enum : int
| Unspec    : 0
| Unix      : 1  /* Unix domain sockets  */
| AfInet    : 2	 /* Internet IP Protocol */
| Bridge    : 7  /* Multiprotocol bridge */
| Inet6     : 10 /* IP version 6	 */
| Max       : 12
 -> AddrFamily;

/* TODO : complete this enum by using socket.h */
enum : int
| SockStream    : 1  /* stream (connection) socket) */
| SockDGram     : 2  /* datagram (conn.less) socket */
| SockRaw       : 3  /* raw socket		    */
| SockRdm       : 4  /* reliably-delivered message  */
| SockSeqPacket : 5  /* sequential packet socket    */
| SockPacket    : 10 /* see socket.h                */
 -> SocketType;

enum : uint
| InAddrAny : 0U /* linux/in.h */
// | InAddrBroadcast : 0xffffffffU
 -> AddrType;

/* TODO : complete the enum by using in.h */
enum : int
| Ip   : 0
| Icmp : 1
| Igmp : 2
| Ipip : 4
| Tcp  : 6
| Egp  : 8
| Pup  : 12
| Udp  : 17
| Ipv6 : 41
| Raw  : 255
 -> IpProtocol;

def CreateSocket (addrFamily : AddrFamily, sockType : SocketType) -> Socket {
    return CreateSocket (addrFamily, sockType, 0);
}

def CreateSocket (addrFamily : AddrFamily, sockType : SocketType, protocol : int) -> Socket {
    let handle = native::socket (addrFamily, sockType, protocol);
    return Socket { handle, addrFamily, sockType };
}

def TcpSocket () -> Socket {
    return CreateSocket (AddrFamily::AfInet, SocketType::SockStream, IpProtocol::Tcp);
}

def UdpSocket () -> Socket {
    return CreateSocket (AddrFamily::AfInet, SocketType::SockDGram, IpProtocol::Udp);
}

// TODO : support ip addr AND hostname
def SockAddrInCreate (ref sockAddrIn : SockAddrIn, const addrFamily : AddrFamily, const port : ushort, const addr : string) -> bool {
    sockAddrIn.sin_family = cast!short(addrFamily);
    sockAddrIn.sin_port = port;

    // we try to translate the ip address into in_addr
    if (native::inet_aton (addr.ptr, &sockAddrIn.sin_addr) == 0)
        return false;
    
    return true;
}

def connect (ref socket : Socket, const ip : string, const port : ushort) -> bool {
    let remoteAddr = SockAddrIn::init;
    remoteAddr.sin_addr.s_addr = native::inet_addr (ip.ptr);
    remoteAddr.sin_family = cast!short (socket.addrFamily);
    remoteAddr.sin_port = native::htons (port);

    return native::connect (socket.handle, cast!(p!SockAddr) (&remoteAddr), SockAddrIn::sizeof) == 0;
}

def bind (ref socket : Socket, port : ushort) -> bool {
    let localAddr = SockAddrIn::init;
    localAddr.sin_family = cast!short (socket.addrFamily);
    localAddr.sin_port = native::htons (port);
    return native::bind (socket.handle, cast!(p!SockAddr) (&localAddr), SockAddrIn::sizeof) == 0;
}

def listen (ref socket : Socket, backlog : int) -> bool {
    return  native::listen (socket.handle, backlog) == 0;
}

def accept (ref socket : Socket, ref clientSocket : Socket, ref clientAddr : SockAddrIn) -> bool {
    let lenAddr = SockAddrIn::sizeof;
    let ret = native::accept (socket.handle, cast!(p!SockAddr) (&clientAddr), cast!(p!uint) (&lenAddr));
    if (ret < 0)
        return false;
    clientSocket.handle = ret;
    return true;
}

def close (ref socket : Socket) {
    native::close (socket.handle);
}

def send (ref socket : Socket, const message : p!byte, const size : uint, const flag : int) -> bool {
    return native::send (socket.handle, cast!(p!void) (message), size, flag) >= 0;
}

def send (T of [U], U) (ref socket : Socket, const message : T, const flag : int) -> bool {
    return socket.send (cast!(p!byte) (message.ptr), cast!uint(message.len), flag);
}

def send (T of [U], U) (ref socket : Socket, const message : T) -> bool {
    return socket.send (cast!(p!byte) (message.ptr), cast!uint(message.len), 0);
}

def send (T) (ref socket : Socket, message : T, const flag : int) -> bool {
    return socket.send (cast!(p!byte) (&message), T::sizeof, flag);
}

def send (T) (ref socket : Socket, message : T) -> bool {
    return socket.send (cast!(p!byte) (&message), T::sizeof, 0);
}

def recv (T of [U], U) (ref socket : Socket, ref outBuffer : T, flag : int) -> int {
    return native::recv (socket.handle, cast!(p!void) (outBuffer.ptr), cast!(uint)(outBuffer.len), flag);
}

def recv (T of [U], U) (ref socket : Socket, ref outBuffer : T) -> int {
    return socket.recv (outBuffer, 0);
}

def recv (T) (ref socket : Socket, ref outBuffer : T, const flag : int) -> int {
    return native::recv (socket.handle, cast!(p!void) (&outBuffer), T::sizeof, flag);
}

def recv (T) (ref socket : Socket, ref outBuffer : T) -> int {
    return socket.recv (outBuffer, 0);
}

def sendTo (ref socket : Socket, const message : p!byte, const size : uint, const destAddr : p!SockAddr, addrlen : uint, const flag : int) -> bool {
    let s = native::sendto (socket.handle, cast!(p!void) (message), size, flag, destAddr, addrlen);
    println ("size : ", s);
    return s >= 0;
}

def sendTo (T of [U], U) (ref socket : Socket, const message : T, const destAddr : p!SockAddr, addrlen : uint, const flag : int) -> bool {
    return socket.sendTo (cast!(p!byte) (message.ptr), cast!uint(message.len), destAddr, addrlen, flag);
}

def sendTo (T of [U], U) (ref socket : Socket, const message : T, const destAddr : p!SockAddr, addrlen : uint) -> bool {
    return socket.sendTo (cast!(p!byte) (message.ptr), cast!uint(message.len), destAddr, addrlen, 0);
}

def sendTo (T) (ref socket : Socket, message : T, const flag : int, const destAddr : p!SockAddr, addrlen : uint) -> bool {
    return socket.sendTo (cast!(p!byte) (&message), T::sizeof, destAddr, addrlen, flag);
}

def sendTo (T) (ref socket : Socket, message : T, const destAddr : p!SockAddr, addrlen : uint) -> bool {
    return socket.sendTo (cast!(p!byte) (&message), T::sizeof, destAddr, addrlen, 0);
}

def recvFrom (T of [U], U) (ref socket : Socket, ref outBuffer : T, srcAddr : p!SockAddr, addrlen : uint, flag : int) -> int {
    return native::recvfrom (socket.handle, cast!(p!void) (outBuffer.ptr), cast!(uint)(outBuffer.len), flag, srcAddr, addrlen);
}

def recvFrom (T of [U], U) (ref socket : Socket, ref outBuffer : T, srcAddr : p!SockAddr, addrlen : uint) -> int {
    println ("recv using ", socket, " on ", *srcAddr, " of size : ", addrlen);
    return socket.recvFrom (outBuffer, srcAddr, addrlen, 0);
}

def recvFrom (T) (ref socket : Socket, ref outBuffer : T, srcAddr : p!SockAddr, addrlen : uint,  const flag : int) -> int {
    return native::recvFrom (socket.handle, cast!(p!void) (&outBuffer), T::sizeof, srcAddr, addrlen, flag);
}

def recvFrom (T) (ref socket : Socket, ref outBuffer : T, srcAddr : p!SockAddr, addrlen : uint) -> int {
    return socket.recvFrom (outBuffer, srcAddr, addrlen, 0);
}

Question syntaxe du for

Ce serait possible de pouvoir faire ça ?

for ((first, second) in listOfPairs) { println (first, second); }

Erreurs avec utilisation de la structure list

mod server;

import core.io;
import std.conv;
import std.socket;
import std.list;
import std.memory;

extern (C) pthread_create (thread : p!ulong, attr : p!void, func : fn(p!void) -> p!void, arg : p!void) -> int;

extern (C) pthread_join (th : ulong, a : p!(p!(void)));
extern (C) pthread_exit (a : int);
extern (C) sleep (a : int);

enum
| InvalidSocket : -1
 -> SockResCode;

enum
| Error : -1
| Success : 0
 -> RetCode;

struct
| sock : int
| nickname : string
 -> User;

static clientsList : List!User;

def main(args) -> int
{
    let port = 8888US;
    let retCode = RetCode::Success;

    if (args.len > 1u)
    {
        port = to!ushort(args[1]);
    }
    
    let sockServer = socket (cast!int(AddrFamily::AfInet), SocketType::SockStream, 0);
    if (sockServer == SockResCode::InvalidSocket)
    {
        println("Error while creating the socket.");
        return RetCode::Error;
    }
    else
    {
        println("Socket created !");
    }

    let serverAddr = SockAddrIn::init;
    serverAddr.sin_family = cast!short (AddrFamily::AfInet);
    serverAddr.sin_addr.s_addr = AddrType::InAddrAny;
    serverAddr.sin_port = htons (port);
    
    let res = bind (sockServer, cast!(p!SockAddr) (&serverAddr), SockAddrIn::sizeof);
    if (res < 0)
    {
        println (("Bind error : ", res));
        retCode = RetCode::Error;
    }
    else
    {
        if (listen (sockServer, 3) < 0)
        {
            println ("Listen error");
            retCode = RetCode::Error;
        }
        else
        {
            println ("Waiting for incoming connections...");
            
            let clientAddr = SockAddrIn::init;
            let lenAddr = SockAddrIn::sizeof;
            
            while (true) {
                let clientSock = accept (sockServer, cast!(p!SockAddr) (&clientAddr), cast!(p!uint) (&lenAddr));

                if (clientSock < 0)
                {
                    println ("Accept error");
                    retCode = RetCode::Error;                
                }
                else
                {
                    println (("Client ", clientSock, " connected !"));
                    
                    startClientThread (clientSock);
                }
            }
        }
    }
    
    close (sockServer);
    return retCode;
}

def startClientThread (sock : int)
{
    let th = 0UL;
    let arg = alloc (sock);
    pthread_create (&th, null, clientHandlerThread, cast!(p!void)(arg));
}

def clientHandlerThread(arg : p!void) -> p!void
{
    let sock = cast!(p!int)(arg);

    let nickname = recvMessageOnSocket (*sock);
    clientsList.push (User { *sock, nickname });

    while (recvMessage(*sock)) {}
    println (("Client ", *sock, "(", nickname, ") disconnected !"));
    return null;
}

def recvMessage (sock : int) -> bool
{
    let message = recvMessageOnSocket (sock);
    if (message.len > 0)
    {
        println (message);
        return true;
    }
    return false;
}

def recvMessageOnSocket (sock : int) -> mut string
{    
    let messageSize = uint::init;
    let readSize = recv (sock, cast!(p!void) (&messageSize), cast!int(uint::sizeof), 0u);
    let emptyStringTmp = [char ; 0U];
    
    if (readSize <= 0)
        return emptyStringTmp;
    
    let message = [char ; messageSize];
    readSize = recv (sock, cast!(p!void) (message.ptr), cast!int(messageSize), 0u);

    if (readSize < 0)
        return emptyStringTmp;

    if (readSize > 0)
        return message;
    return emptyStringTmp;
}
[ 75%] Building C object CMakeFiles/../server.dir/server.yr.o
Error : Undefined identifier 'opAssign', maybe 'to' was meant
 --> /home/guillaume/gcc/gcc-install/bin/../lib/gcc/x86_64-pc-linux-gnu/8.0.1/include/ymir/std/list.yr:(25,33)
    | 
25  |                 (*current).next = alloc (Node!T {b, null});
    |                                 ^
Error : Operator '=' between types 'ptr!std.list.Node!()' and 'ptr!std.list.Node!(const(server.User!()))' doesn't exist
 --> /home/guillaume/gcc/gcc-install/bin/../lib/gcc/x86_64-pc-linux-gnu/8.0.1/include/ymir/std/list.yr:(25,33)
    | 
25  |                 (*current).next = alloc (Node!T {b, null});
    |                                 ^
Error : Undefined identifier 'opAssign', maybe 'to' was meant
 --> /home/guillaume/gcc/gcc-install/bin/../lib/gcc/x86_64-pc-linux-gnu/8.0.1/include/ymir/std/list.yr:(28,21)
    | 
28  |             current = (*current).next;
    |                     ^
Error : Operator '=' between types 'ptr!std.list.Node!(server.User!())' and 'ptr!std.list.Node!()' doesn't exist
 --> /home/guillaume/gcc/gcc-install/bin/../lib/gcc/x86_64-pc-linux-gnu/8.0.1/include/ymir/std/list.yr:(28,21)
    | 
28  |             current = (*current).next;
    |                     ^
Note : Template creation
 --> /home/guillaume/Documents/ymir/Ymir-Test/socket/server.yr:(111,17)
    | 
111 |     clientsList.push (User { *sock, nickname });
    |                 ^^^^
ymir1: erreur interne du compilateur : Erreur de segmentation
0xc3021f crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x6de6cc fgets
        /usr/include/x86_64-linux-gnu/bits/stdio2.h:262
0x6de6cc Ymir::readln[abi:cxx11](_IO_FILE*)
        ../../gcc-src/gcc/ymir/Error.cc:39
0x6de8af Ymir::getLine[abi:cxx11](unsigned int const&, char const*)
        ../../gcc-src/gcc/ymir/Error.cc:53
0x6df6ec Ymir::addLine(std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >&, Word const&)
        ../../gcc-src/gcc/ymir/Error.cc:94
0x6dfec8 Ymir::addLine(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, Word const&)
        ../../gcc-src/gcc/ymir/Error.cc:208
0x6e5ae4 Ymir::Error::templateCreation(Word const&)
        ../../gcc-src/gcc/ymir/Error.cc:497
0x6d8797 semantic::IFunctionInfo::CallOp(Word, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/FunctionInfo.cc:189
0x6d6c84 semantic::IFunctionInfo::CompOp(semantic::IInfoType*)
        ../../gcc-src/gcc/ymir/FunctionInfo.cc:297
0x6d6184 semantic::IFrame::getScore(Word, std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/Frame.cc:73
0x6d64c0 semantic::IFrame::isApplicable(Word, std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/Frame.cc:104
0x6db4cd semantic::IExternFrame::isApplicable(syntax::IParamList*)
        ../../gcc-src/gcc/ymir/ExternFrame.cc:39
0x6d8be7 semantic::IFunctionInfo::CallOp(Word, syntax::IParamList*)
        ../../gcc-src/gcc/ymir/FunctionInfo.cc:215
0x68378d syntax::IPar::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:1031
0x6fd579 syntax::IBlock::blockWithoutEnter()
        ../../gcc-src/gcc/ymir/astInstruction.cc:40
0x6fd605 syntax::IBlock::block()
        ../../gcc-src/gcc/ymir/astInstruction.cc:17
0x6d26e2 semantic::IFrame::validate(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
        ../../gcc-src/gcc/ymir/Frame.cc:133
0x69c1fc semantic::IPureFrame::validate()
        ../../gcc-src/gcc/ymir/PureFrame.cc:38
0x6d90a0 semantic::IFunctionInfo::CallOp(Word, syntax::IParamList*)
        ../../gcc-src/gcc/ymir/FunctionInfo.cc:251
0x68378d syntax::IPar::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:1031

Pas possible de compiler cet exemple de match utilisé en tant qu'expression

Je sais pas si c'est sensé marcher, mais cet exemple de la doc ne compile pas :

import core.io;

def main () {
    let boolean = true;

    // Match can be used as expression too
    let binary = match boolean {
        false => 0UB;
        _ => 1UB; // any other cases
    };

    println (boolean, " -> ", binary);
}
Error : Variable 'match' has no type
 --> test.yr:(7,18)
    | 
 7  |     let binary = match boolean {
    |                  ^^^^^
Error : Variable 'binary' has no type
 --> test.yr:(12,31)
    | 
12  |     println (boolean, " -> ", binary);
    |                               ^^^^^^
ymir1: erreur fatale : NB Error : 2

Faire une nouvelle doc

L'ancienne doc ne correspond pas à la dernière version de Ymir, donc faut en faire une nouvelle

Segfault du compilateur avec le code de la doc des enum

import core.io;

// This enum is typed as string, but any type can be used
enum Person {
    Engineer : "eng",
    Scientist : "sci"
}

// This function take an enum as an argument 
def inspect (p : Person) {
    // Match are used to branch over multiple values
    match p {
        Person::Engineer => println ("Engineer");
        Person::Scientist => println ("Scientist");
    }
}

def main () {
    let michel = ("Michel", Person::Engineer);
    
    inspect (michel.1);
    inspect (Person::Scientist);
}
ymir1: erreur interne du compilateur : Erreur de segmentation
0xc306cf crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x6cf86c std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> >::size() const
        /usr/include/c++/7/bits/stl_vector.h:671
0x6cf86c semantic::IPtrInfo::create(Word, std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
        ../../gcc-src/gcc/ymir/PtrInfo.cc:93
0x69739e semantic::IInfoType::factory(Word, std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
        ../../gcc-src/gcc/ymir/InfoType.cc:58
0x67cb12 syntax::IVar::asType()
        ../../gcc-src/gcc/ymir/astExpression.cc:180
0x684246 syntax::IVar::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:112
0x67dea9 syntax::IBinary::affect()
        ../../gcc-src/gcc/ymir/astExpression.cc:468
0x67ea61 syntax::IBinary::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:429
0x6ffaf2 syntax::IMatch::instruction()
        ../../gcc-src/gcc/ymir/astInstruction.cc:397
0x6fd759 syntax::IBlock::blockWithoutEnter()
        ../../gcc-src/gcc/ymir/astInstruction.cc:40
0x6fd7e5 syntax::IBlock::block()
        ../../gcc-src/gcc/ymir/astInstruction.cc:17
0x6d2862 semantic::IFrame::validate(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
        ../../gcc-src/gcc/ymir/Frame.cc:133
0x69c37c semantic::IPureFrame::validate()
        ../../gcc-src/gcc/ymir/PureFrame.cc:38
0x715ea0 Ymir::Parser::semantic_time(syntax::IProgram*)
        ../../gcc-src/gcc/ymir/Parser.cc:77
0x71604f ymir_parse_file
        ../../gcc-src/gcc/ymir/Parser.cc:116
0x71604f ymir_parse_files(int, char const**)
        ../../gcc-src/gcc/ymir/Parser.cc:103

Variable qui semble ne pas se mettre à jour après affectation

Dans un constructeur static, je donne une valeur d'enum à une variable, je push cette valeur sur une list, puis je change la valeur de la variable, et je push à nouveau. C'est la première valeur que je retrouve dans les deux cases de ma liste.

import core.io;

import std.list;

enum
| Tee : 0
| OtherTee : 1
 -> TestEnum;

struct
| value : TestEnum
 -> TestStruct;

static gTestList : List!TestStruct;

self ()
{
    gTestList = list!TestStruct ();
    let val = TestEnum::Tee;
    gTestList.push (TestStruct { val });
    val = TestEnum::OtherTee;
    gTestList.push (TestStruct { val });
}

def main()
{
    let next_ = gTestList.next();
    while (next_ !is null)
    {
        println ((*next_).value);
        next_ = next_.next();
    }
}

Sortie :

test.TestStruct(0)
test.TestStruct(0)

Le elseif semble déconner

Ca marche si je découpe le elseif en un else puis un if mais le elseif compile pas.

import core.io;

def main (){
    let n = 5;
    
    if (n < 0) {
        println (n, "test");
    } else if (n > 0) {
        println (n, "is positive");
    }
}
ymir1: erreur fatale : ['}' ','] expected, when ; found
 --> test.yr:(9,35)
    | 
 9  |         println (n, "is positive");
    |                                   ^

Une erreur non gérée rencontrée

J'ai voulu placer du code dans un autre fichier pour l'inclure depuis mon code principal.

gyc server.yr core/io.yr std/socket.yr 
Assert : TODO
ymir1: erreur interne du compilateur: Erreur de segmentation
0xc18c1f crash_signal
	../../gcc-src/gcc/toplev.c:325
0x6ddfee void Ymir::Error::assert_<>(char const*)
	../../gcc-src/gcc/ymir/errors/Error.hh:286
0x6ddfee Ymir::Error::assert(char const*)
	../../gcc-src/gcc/ymir/Error.cc:825
0x6fccaf syntax::IProgram::declareAsExtern(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, semantic::IModule*)
	../../gcc-src/gcc/ymir/astDeclaration.cc:157
0x6fd97b syntax::IImport::declare()
	../../gcc-src/gcc/ymir/astDeclaration.cc:202
0x6fca0b syntax::IProgram::declare()
	../../gcc-src/gcc/ymir/astDeclaration.cc:145
0x70a694 Ymir::Parser::semantic_time(syntax::IProgram*)
	../../gcc-src/gcc/ymir/Parser.cc:58
0x70a897 ymir_parse_file
	../../gcc-src/gcc/ymir/Parser.cc:101
0x70a897 ymir_parse_files(int, char const**)
	../../gcc-src/gcc/ymir/Parser.cc:88

Possible erreur avec l'itération sur un range

Si on a un range 1 .. 3, ça représente bien 3 valeurs ? 1 et 3 étant tous les deux inclus ?
Si oui, comme le montre le code suivant, la seconde borne est exclue :

import core.io;

def main () {
    // rng is r!(int);
    let rng = 1 .. 3;

    for i in rng
        println (i);
}

Erreur suite à une affectation dans la condition d'un if

import core.io;

extern (C) printf (const c : p!char, ...);

extern (C) socket (addrFamily : int, socketType : int, protocol : int) -> int;
extern (C) close (fd : int) -> int;
extern (C) recv (s : int, buf : p!void, len : int, flags : uint) -> int;
extern (C) listen (s : int, backlog : int) -> int;
extern (C) bind (sockfd : int, my_addr : p!SockAddr, addrlen : uint) -> int;
extern (C) accept (sock : int, addr : p!SockAddr, addlen : p!uint) -> int;
extern (C) htons (host : ushort) -> ushort;

struct
| s_addr : uint
 -> InAddr;

struct
| sin_len : ubyte
| sin_family : ushort
| sin_port : ushort
| sin_addr : InAddr
| sin_zero : [ubyte ; 8U]
 -> SockAddrIn;

struct
| sa_len : ubyte
| sa_family : p!void
| sa_data : [ubyte ; 14U]
 -> SockAddr;

/* TODO : complete this enum by using socket.h */
enum
| AfInet : 2US	/* Internet IP Protocol */
 -> AddrFamily;

/* TODO : complete this enum by using socket.h */
enum
| SockStream : 1 /* stream (connection) socket) */
 -> SocketType;

enum
| InvalidSocket : -1
 -> SockResCode;

enum : uint
| InAddrAny : 0U /* linux/in.h */
 -> AddrType;

enum
| Error : -1
| Success : 0
 -> RetCode;

def main()
{
    let imut Port = 8888US;
    let retCode = RetCode::Success;
    
    let sockServer = socket (cast!int(AddrFamily::AfInet), SocketType::SockStream, 0);
    if (sockServer == SockResCode::InvalidSocket)
    {
        println("Error while creating the socket.");
        return -1;
    }
    else
    {
        println("Socket created !");
    }

    let serverAddr = SockAddrIn::init;
    serverAddr.sin_family = AddrFamily::AfInet;
    serverAddr.sin_addr.s_addr = AddrType::InAddrAny;
    serverAddr.sin_port = htons (Port);

    printf("sin_family = %d\n".ptr, serverAddr.sin_family);
    printf("sin_addr.s_addr = %d\n".ptr, serverAddr.sin_addr.s_addr);
    printf("sin_port = %d\n".ptr, serverAddr.sin_port);

    let res = 0;
    if ((res = bind (sockServer, cast!(p!SockAddr) (&serverAddr), SockAddrIn::sizeof)) < 0)
    {
        printf("err : %d\n".ptr, res);
        println ("Bind error");
        retCode = RetCode::Error;
    }
    else
    {
        if (listen (sockServer, 3) < 0)
        {
            println ("Listen error");
            retCode = RetCode::Error;
        }
        else
        {
            println ("Waiting for incoming connections...");

            let clientAddr = SockAddrIn::init;
            let lenAddr = SockAddrIn::sizeof;
            let clientSock = accept (sockServer, cast!(p!SockAddr) (&clientAddr), cast!(p!uint) (&lenAddr));

            if (clientSock < 0)
            {
                println ("Accept error");
                retCode = RetCode::Error;                
            }
            else
            {
                println ("Client connected !");
            }
        }
    }
    
    close (sockServer);
    return retCode;
}

: Dans la fonction « _Ymain »:
:80:88: erreur interne du compilateur: dans gimplify_expr, à gimplify.c:12382
0x9898d9 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
	../../gcc-src/gcc/gimplify.c:12382
0x984aaf gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
	../../gcc-src/gcc/gimplify.c:12160
0x98ee5c gimplify_cond_expr
	../../gcc-src/gcc/gimplify.c:4065
0x986ea0 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
	../../gcc-src/gcc/gimplify.c:11391
0x989fd8 gimplify_stmt(tree_node**, gimple**)
	../../gcc-src/gcc/gimplify.c:6658
0x985bbb gimplify_statement_list
	../../gcc-src/gcc/gimplify.c:1767
0x985bbb gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
	../../gcc-src/gcc/gimplify.c:11863
0x989fd8 gimplify_stmt(tree_node**, gimple**)
	../../gcc-src/gcc/gimplify.c:6658
0x98b123 gimplify_bind_expr
	../../gcc-src/gcc/gimplify.c:1335
0x9871a2 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
	../../gcc-src/gcc/gimplify.c:11635
0x989fd8 gimplify_stmt(tree_node**, gimple**)
	../../gcc-src/gcc/gimplify.c:6658
0x985bbb gimplify_statement_list
	../../gcc-src/gcc/gimplify.c:1767
0x985bbb gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
	../../gcc-src/gcc/gimplify.c:11863
0x989fd8 gimplify_stmt(tree_node**, gimple**)
	../../gcc-src/gcc/gimplify.c:6658
0x98b123 gimplify_bind_expr
	../../gcc-src/gcc/gimplify.c:1335
0x9871a2 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*), int)
	../../gcc-src/gcc/gimplify.c:11635
0x989fd8 gimplify_stmt(tree_node**, gimple**)
	../../gcc-src/gcc/gimplify.c:6658
0x98c15a gimplify_body(tree_node*, bool)
	../../gcc-src/gcc/gimplify.c:12635
0x98c834 gimplify_function_tree(tree_node*)
	../../gcc-src/gcc/gimplify.c:12800
0x6f44fc semantic::IFinalFrame::finalize()
	../../gcc-src/gcc/ymir/FinalFrame.cc:202

Erreur tuples

Si on a un tupe qui contient un string, on ne peut pas afficher cette valeur du tuple en particulier :

import core.io;

def main () {
    let tuple = (1UB, "salut", 'r');
    
    println ("test0 : ", tuple.0);
    println ("test1", tuple.1); // erreur de compilation
    println ("test2 : ", tuple.2);
}

Erreur non gérée (Assert) avec code de test sur cocket

Assert à cause d'une erreur non gérée qui survient quand j'appelle la fonction socket :

import core.io;

// struct sockaddr_in {
//    uint8_t         sin_len;       /* longueur totale      */
//    sa_family_t     sin_family;    /* famille : AF_INET     */
//    in_port_t       sin_port;      /* le numéro de port    */
//    struct in_addr  sin_addr;      /* l'adresse internet   */
//    unsigned char   sin_zero[8];   /* un champ de 8 zéros  */
// };

// struct sockaddr {
//    unsigned char   sa_len;         /* longueur totale 		*/
//    sa_family_t     sa_family;      /* famille d'adresse 	*/
//    char            sa_data[14];    /* valeur de l'adresse	*/
// };

/* TODO : complete this enum by using socket.h */
enum
    | AfInet : 2	/* Internet IP Protocol */
 -> AddrFamily;

/* TODO : complete this enum by using socket.h */
enum
    | SockStream : 1 /* stream (connection) socket) */
 -> SocketType;

enum
    | InvalidSocket : -1
 -> SockResCode;

struct
    | sa_len : ubyte
    | sa_family : p!void
    | sa_data : [char ; 14U]
                 -> Sockaddr;

// struct in_addr {
//    in_addr_t	s_addr;
// };

// struct hostent {
//    char    *h_name;       /* Nom officiel de l'hôte.   */
//    char   **h_aliases;    /* Liste d'alias.            */
//    int      h_addrtype;   /* Type d'adresse de l'hôte. */
//    int      h_length;     /* Longueur de l'adresse.    */
//    char   **h_addr_list;  /* Liste d'adresses.         */
// }

extern (C) socket (addrFamily : int, socketType : int, protocol) -> int;
extern (C) close (fd : int) -> int;
extern (C) recv (s : int, buf : p!void, len : int, flags : uint) -> int;
extern (C) listen (s : int, backlog : int) -> int;
extern (C) bind (sockfd : int, my_addr : p!Sockaddr, addrlen : uint) -> int;
extern (C) accept (sock : int, addr : p!Sockaddr, addlrn : uint) -> int;

def main()
{
    let sock = socket (AddrFamily::AfInet, SocketType::SockStream, 0);
//     if (sock == SockResCode::InvalidSocket)
//     {
//         println("Error while creating the socket.");
//         return -1;
//     }
//     close (sock);
//     return 0;
// }
}
Assert : TODO, gerer l'erreur
ymir1: erreur interne du compilateur: Erreur de segmentation
0xc13f3f crash_signal
	../../gcc-src/gcc/toplev.c:325
0x6de01e void Ymir::Error::assert_<>(char const*)
	../../gcc-src/gcc/ymir/errors/Error.hh:284
0x6de01e Ymir::Error::assert(char const*)
	../../gcc-src/gcc/ymir/Error.cc:815
0x67a3d9 syntax::IVar::var()
	../../gcc-src/gcc/ymir/astExpression.cc:114
0x6d4ed7 semantic::IFrame::computeParams(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
	../../gcc-src/gcc/ymir/Frame.cc:199
0x6d935e semantic::IExternFrame::validate()
	../../gcc-src/gcc/ymir/ExternFrame.cc:57
0x6d7f20 semantic::IFunctionInfo::CallOp(Word, syntax::IParamList*)
	../../gcc-src/gcc/ymir/FunctionInfo.cc:243
0x681715 syntax::IPar::expression()
	../../gcc-src/gcc/ymir/astExpression.cc:969
0x67b899 syntax::IBinary::affect()
	../../gcc-src/gcc/ymir/astExpression.cc:455
0x67c401 syntax::IBinary::expression()
	../../gcc-src/gcc/ymir/astExpression.cc:416
0x6f7de0 syntax::IVarDecl::instruction()
	../../gcc-src/gcc/ymir/astInstruction.cc:102
0x6f8799 syntax::IBlock::blockWithoutEnter()
	../../gcc-src/gcc/ymir/astInstruction.cc:40
0x6f8825 syntax::IBlock::block()
	../../gcc-src/gcc/ymir/astInstruction.cc:17
0x6d1d06 semantic::IFrame::validate(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
	../../gcc-src/gcc/ymir/Frame.cc:126
0x69bc6c semantic::IPureFrame::validate()
	../../gcc-src/gcc/ymir/PureFrame.cc:38
0x69b684 semantic::IPureFrame::validateMain()
	../../gcc-src/gcc/ymir/PureFrame.cc:62
0x69bcd1 semantic::IPureFrame::validate()
	../../gcc-src/gcc/ymir/PureFrame.cc:32
0x7092eb Ymir::Parser::semantic_time(syntax::IProgram*)
	../../gcc-src/gcc/ymir/Parser.cc:65
0x709467 ymir_parse_file
	../../gcc-src/gcc/ymir/Parser.cc:101
0x709467 ymir_parse_files(int, char const**)
	../../gcc-src/gcc/ymir/Parser.cc:88
Veuillez soumettre un rapport d’anomalies complet,
avec la sortie du préprocesseur si nécessaire.
Please include the complete backtrace with any bug report.
Voir <https://gcc.gnu.org/bugs/> pour les instructions.

Erreur non gérée (2)

Cette foic-ci, premier test dans ma recherche de construction d'un map !

import core.io;

struct (A, B)
| index : A
| value : B
| next : p!(MapEntry!(A,B))
 -> MapEntry;

struct (A, B)
| head : p!(MapEntry!(A,B))
 -> Map;

def map (A, B) ()
{
    return Map!(A, B) { null };
}

def test()
{
    println ("test!");
}

def foo()
{
    println ("test");
}

def main()
{
    let a = map!(string, fn() -> void);
    println (a);
}
Assert : TODO {IInstruction, IExpression, IFuncPtr}
ymir1: erreur interne du compilateur: Erreur de segmentation
0xc18c1f crash_signal
	../../gcc-src/gcc/toplev.c:325
0x6ddfee void Ymir::Error::assert_<>(char const*)
	../../gcc-src/gcc/ymir/errors/Error.hh:286
0x6ddfee Ymir::Error::assert(char const*)
	../../gcc-src/gcc/ymir/Error.cc:825
0x69d045 syntax::IExpression::prettyPrint[abi:cxx11]()
	../../gcc-src/gcc/ymir/astAux.cc:1104
0x69b185 Ymir::OutBuffer::write_(syntax::IExpression*)
	../../gcc-src/gcc/ymir/OutBuffer.cc:90
0x6e743d void Ymir::OutBuffer::write_<syntax::IExpression*>(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
	../../gcc-src/gcc/ymir/utils/OutBuffer.hh:127
0x6e743d void Ymir::OutBuffer::write<std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> >, char const*>(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> >, char const*)
	../../gcc-src/gcc/ymir/utils/OutBuffer.hh:49
0x6e743d void Ymir::OutBuffer::write<char const*, std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> >, char const*>(char const*, std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> >, char const*)
	../../gcc-src/gcc/ymir/utils/OutBuffer.hh:50
0x6e743d Ymir::OutBuffer::OutBuffer<char const*, std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> >, char const*>(char const*, std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> >, char const*)
	../../gcc-src/gcc/ymir/utils/OutBuffer.hh:35
0x6e743d Ymir::Error::notATemplate(Word const&, std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> >&)
	../../gcc-src/gcc/ymir/Error.cc:248
0x681f3c syntax::IVar::expression()
	../../gcc-src/gcc/ymir/astExpression.cc:97
0x67f3eb syntax::IPar::expression()
	../../gcc-src/gcc/ymir/astExpression.cc:961
0x681e89 syntax::IVar::expression()
	../../gcc-src/gcc/ymir/astExpression.cc:79
0x67c079 syntax::IBinary::affect()
	../../gcc-src/gcc/ymir/astExpression.cc:456
0x67cbc1 syntax::IBinary::expression()
	../../gcc-src/gcc/ymir/astExpression.cc:417
0x6f9320 syntax::IVarDecl::instruction()
	../../gcc-src/gcc/ymir/astInstruction.cc:102
0x6f8319 syntax::IBlock::blockWithoutEnter()
	../../gcc-src/gcc/ymir/astInstruction.cc:40
0x6f83a5 syntax::IBlock::block()
	../../gcc-src/gcc/ymir/astInstruction.cc:17
0x6d1cc6 semantic::IFrame::validate(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
	../../gcc-src/gcc/ymir/Frame.cc:126
0x69c0ac semantic::IPureFrame::validate()
	../../gcc-src/gcc/ymir/PureFrame.cc:38

Segfault des familles, le retour

Même pas de message d'erreur !

https://github.com/GNU-Ymir/Ymir-Test/tree/master/issues/issue_36

Scanning dependencies of target teelol
[ 12%] Building C object CMakeFiles/../teelol.dir/main.yr.o
ymir1: erreur interne du compilateur : Erreur de segmentation
0xc477af crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x6a2580 semantic::ISymbol::isConst(bool)
        ../../gcc-src/gcc/ymir/Symbol.cc:23
0x75d9f8 semantic::IStructCstInfo::getScore(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
        ../../gcc-src/gcc/ymir/StructInfo.cc:328
0x680013 syntax::IVar::asType()
        ../../gcc-src/gcc/ymir/astExpression.cc:181
0x684d55 syntax::ITypedVar::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:357
0x6df5d7 semantic::IFrame::computeParams(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
        ../../gcc-src/gcc/ymir/Frame.cc:215
0x6e40ae semantic::IExternFrame::validate()
        ../../gcc-src/gcc/ymir/ExternFrame.cc:62
0x726dc8 Ymir::Parser::semantic_time(syntax::IProgram*)
        ../../gcc-src/gcc/ymir/Parser.cc:79
0x726f7f ymir_parse_file
        ../../gcc-src/gcc/ymir/Parser.cc:119
0x726f7f ymir_parse_files(int, char const**)
        ../../gcc-src/gcc/ymir/Parser.cc:106
Veuillez soumettre un rapport d’anomalies complet,
avec la sortie du préprocesseur si nécessaire.
Please include the complete backtrace with any bug report.
Voir <https://gcc.gnu.org/bugs/> pour les instructions.
CMakeFiles/../teelol.dir/build.make:62 : la recette pour la cible « CMakeFiles/../teelol.dir/main.yr.o » a échouée
make[2]: *** [CMakeFiles/../teelol.dir/main.yr.o] Erreur 1
CMakeFiles/Makefile2:67 : la recette pour la cible « CMakeFiles/../teelol.dir/all » a échouée
make[1]: *** [CMakeFiles/../teelol.dir/all] Erreur 2
Makefile:83 : la recette pour la cible « all » a échouée
make: *** [all] Erreur 2

Vérifier l'appartenance à la frame pour les retours de pointeurs

Il y a deux cas où on peut savoir que l'utilisateur va écrire un code qui plante.

def foo () -> p!int {
   let i = 12;
   return &i; // Retourne une adresse locale
}

def foo () -> dg (int)-> void {
  let a = 1;
  return () => a + 2; // Retourne un delegate qui possède un adresse locale 
}

Segfault avec un code simple

Le code est sans doute faux, j'ai juste testé plein de trucs à l'arrache style :

import core.io;

struct
| x : int
| y : int
-> Point;

def main()
{
    println("test");
    let a = Point(0, 0);
}

Réponse du compilo :

gyc test.yr 
ymir1: erreur interne du compilateur: Erreur de segmentation
0xc13f3f crash_signal
	../../gcc-src/gcc/toplev.c:325
0x6ceeec std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> >::size() const
	/usr/include/c++/7/bits/stl_vector.h:671
0x6ceeec semantic::IPtrInfo::create(Word, std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
	../../gcc-src/gcc/ymir/PtrInfo.cc:86
0x69456e semantic::IInfoType::factory(Word, std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
	../../gcc-src/gcc/ymir/InfoType.cc:57
0x67a4ea syntax::IVar::asType()
	../../gcc-src/gcc/ymir/astExpression.cc:169
0x680e41 syntax::IVar::expression()
	../../gcc-src/gcc/ymir/astExpression.cc:104
0x67b889 syntax::IBinary::affect()
	../../gcc-src/gcc/ymir/astExpression.cc:455
0x67c401 syntax::IBinary::expression()
	../../gcc-src/gcc/ymir/astExpression.cc:416
0x6f7de0 syntax::IVarDecl::instruction()
	../../gcc-src/gcc/ymir/astInstruction.cc:102
0x6f8799 syntax::IBlock::blockWithoutEnter()
	../../gcc-src/gcc/ymir/astInstruction.cc:40
0x6f8825 syntax::IBlock::block()
	../../gcc-src/gcc/ymir/astInstruction.cc:17
0x6d1d06 semantic::IFrame::validate(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
	../../gcc-src/gcc/ymir/Frame.cc:126
0x69bc6c semantic::IPureFrame::validate()
	../../gcc-src/gcc/ymir/PureFrame.cc:38
0x69b684 semantic::IPureFrame::validateMain()
	../../gcc-src/gcc/ymir/PureFrame.cc:62
0x69bcd1 semantic::IPureFrame::validate()
	../../gcc-src/gcc/ymir/PureFrame.cc:32
0x7092eb Ymir::Parser::semantic_time(syntax::IProgram*)
	../../gcc-src/gcc/ymir/Parser.cc:65
0x709467 ymir_parse_file
	../../gcc-src/gcc/ymir/Parser.cc:101
0x709467 ymir_parse_files(int, char const**)
	../../gcc-src/gcc/ymir/Parser.cc:88
Veuillez soumettre un rapport d’anomalies complet,
avec la sortie du préprocesseur si nécessaire.
Please include the complete backtrace with any bug report.
Voir <https://gcc.gnu.org/bugs/> pour les instructions.

Faudra voir si tu peux pas changer la dernière ligne pour rediriger vers le git du projet !

Impossible d'utiliser des types différents dans variadic template ?

Je dois pas faire comme il faut mais je ne peux pas avoir plusieurs types différents en variadic templates, normal ?

Code d'exemple :

import core.io;

struct (T...)
| func : [fn (T) -> void]
 -> Signal;

def connect (T...) (ref sig : Signal!T, foo : fn (T) -> void) {
    sig.func = sig.func ~ [foo];
}

def call (T...) (ref sig : Signal!T, elems : T) {
    for it in 0U .. sig.func.len {
        sig.func [it] (elems.expand);
    }
}

def test (ref a : Test, b : int, c : int)
{
    let (x, y) = (b, c);
    println (a.a, x, y);
}

def test2 (ref a : Test, b : t!(int, int))
{
    let (x, y) = b;
    println (a.a, x, y);
}

struct
| a : int
 -> Test;

def main() {
    let a = Signal!(ref Test, int, int)::init;
    let b = Signal!(ref Test, t!(int, int))::init;
    a.connect (test);
    b.connect (test2);
    let letest = Test { 2 };
    a.call (letest, 1, 0);
    b.call (letest, (1, 0));
}
Error : Operator '()' is undefined for type 'function <test.call> (ref sig : Signal!(T), elems : T)' and (test.Signal!({ref(test.Test), int, int}), test.Test, const(int), const(int))
 --> test.yr:(39,12)
    | 
39  |     a.call (letest, 1, 0);
    |            ^            ^
Error : Operator '()' is undefined for type 'function <test.call> (ref sig : Signal!(T), elems : T)' and (test.Signal!({ref(test.Test), t(int, int)}), test.Test, const(t(const(int), const(int))))
 --> test.yr:(40,12)
    | 
40  |     b.call (letest, (1, 0));
    |            ^              ^
ymir1: erreur fatale : NB Error : 2
compilation terminée.

Segfault du compilo !

J'étais en train d'ajouter du template dans eventHandler afin de pouvoir d'autres controller plutôt que seulement "Game".

Tout est dans la branche issue_45 du dépôt, suffit d'aller voir les deux derniers commits dans Teelol : https://github.com/GNU-Ymir/Ymir-Test/tree/issue_45

[  3%] Building C object CMakeFiles/../teelol.dir/mainGame.yr.o
ymir1: erreur interne du compilateur : Erreur de segmentation
0xc6993f crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x6f7cf5 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign(char const*)
        /usr/include/c++/7/bits/basic_string.h:1420
0x6f7cf5 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(char const*)
        /usr/include/c++/7/bits/basic_string.h:694
0x6f7cf5 Word::setLocus(unsigned int)
        ../../gcc-src/gcc/ymir/Word.cc:50
0x76b7fb syntax::IVar::templateExpReplace(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, syntax::IExpression*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, syntax::IExpression*> > > const&)
        ../../gcc-src/gcc/ymir/astTemplate.cc:487
0x76b9de syntax::IVar::templateExpReplace(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, syntax::IExpression*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, syntax::IExpression*> > > const&)
        ../../gcc-src/gcc/ymir/astTemplate.cc:513
0x76b9de syntax::IVar::templateExpReplace(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, syntax::IExpression*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, syntax::IExpression*> > > const&)
        ../../gcc-src/gcc/ymir/astTemplate.cc:513
0x76bf73 syntax::ITypedVar::templateExpReplace(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, syntax::IExpression*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, syntax::IExpression*> > > const&)
        ../../gcc-src/gcc/ymir/astTemplate.cc:430
0x776371 semantic::IStructCstInfo::getScore(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
        ../../gcc-src/gcc/ymir/StructInfo.cc:332
0x776aca semantic::IStructCstInfo::TempOp(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
        ../../gcc-src/gcc/ymir/StructInfo.cc:254
0x686f03 syntax::IVar::asType()
        ../../gcc-src/gcc/ymir/astExpression.cc:211
0x68df94 syntax::ITypedVar::getType()
        ../../gcc-src/gcc/ymir/astExpression.cc:346
0x7771f5 semantic::IStructCstInfo::TempOp(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
        ../../gcc-src/gcc/ymir/StructInfo.cc:275
0x686f4c syntax::IVar::asType()
        ../../gcc-src/gcc/ymir/astExpression.cc:213
0x68df94 syntax::ITypedVar::getType()
        ../../gcc-src/gcc/ymir/astExpression.cc:346
0x7771f5 semantic::IStructCstInfo::TempOp(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
        ../../gcc-src/gcc/ymir/StructInfo.cc:275
0x686f03 syntax::IVar::asType()
        ../../gcc-src/gcc/ymir/astExpression.cc:211
0x68c3c5 syntax::ITypedVar::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:387
0x6ef7f7 semantic::IFrame::computeParams(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
        ../../gcc-src/gcc/ymir/Frame.cc:217
0x6f46c0 semantic::IExternFrame::validate()
        ../../gcc-src/gcc/ymir/ExternFrame.cc:65
Veuillez soumettre un rapport d’anomalies complet,
avec la sortie du préprocesseur si nécessaire.
Please include the complete backtrace with any bug report.
Voir <https://gcc.gnu.org/bugs/> pour les instructions.
CMakeFiles/../teelol.dir/build.make:62 : la recette pour la cible « CMakeFiles/../teelol.dir/mainGame.yr.o » a échouée
make[2]: *** [CMakeFiles/../teelol.dir/mainGame.yr.o] Erreur 1
CMakeFiles/Makefile2:67 : la recette pour la cible « CMakeFiles/../teelol.dir/all » a échouée
make[1]: *** [CMakeFiles/../teelol.dir/all] Erreur 2
Makefile:83 : la recette pour la cible « all » a échouée
make: *** [all] Erreur 2

Segfault de familles

T'avais l'air de t'ennuyer alors voilà, j'ai fait des modif pour gérer correctement tous les types d'événements, je compile, et boum. J'ai pas cherché à corriger donc si il y a des bugs de merde c'est normal.

Lien vers l'issue 35 : https://github.com/GNU-Ymir/Ymir-Test/tree/master/issues/issue_35

[ 12%] Building C object CMakeFiles/../teelol.dir/src/eventHandler.yr.o
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(11,24)
    | 
11  | | signal : Signal!(ref Game)
    |                        ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(17,24)
    | 
17  | | signal : Signal!(ref Game)
    |                        ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(31,36)
    | 
31  | def createEventHandler (ref game : Game) -> mut EventHandler
    |                                    ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(31,49)
    | 
31  | def createEventHandler (ref game : Game) -> mut EventHandler
    |                                                 ^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(39,29)
    | 
39  | def onEvent (ref eventHdl : EventHandler, eventType : SDL_EventType, signal : Signal!(ref Game))
    |                             ^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(39,91)
    | 
39  | def onEvent (ref eventHdl : EventHandler, eventType : SDL_EventType, signal : Signal!(ref Game))
    |                                                                                           ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(44,29)
    | 
44  | def onEvent (ref eventHdl : EventHandler, eventType : SDL_EventType, keyCode : SDL_Keycode, signal : Signal!(ref Game))
    |                             ^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(44,114)
    | 
44  | def onEvent (ref eventHdl : EventHandler, eventType : SDL_EventType, keyCode : SDL_Keycode, signal : Signal!(ref Game))
    |                                                                                                                  ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(49,29)
    | 
49  | def onEvent (ref eventHdl : EventHandler, eventType : SDL_EvenType, keyScanCode : SDL_Scancode, signal : Signal!(ref Game))
    |                             ^^^^^^^^^^^^
Error : Undefined identifier 'SDL_EvenType', maybe 'SDL_EventType' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(49,55)
    | 
49  | def onEvent (ref eventHdl : EventHandler, eventType : SDL_EvenType, keyScanCode : SDL_Scancode, signal : Signal!(ref Game))
    |                                                       ^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(49,118)
    | 
49  | def onEvent (ref eventHdl : EventHandler, eventType : SDL_EvenType, keyScanCode : SDL_Scancode, signal : Signal!(ref Game))
    |                                                                                                                      ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(54,33)
    | 
54  | def handleEvents(ref eventHdl : EventHandler)
    |                                 ^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(83,40)
    | 
83  | def handleClassicEvent (ref eventHdl : EventHandler, eventType : uint)
    |                                        ^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(97,41)
    | 
97  | def handleKeyboardEvent (ref eventHdl : EventHandler, eventType : uint, keyCode : int)
    |                                         ^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/eventHandler.yr:(111,54)
    | 
111 | def handleKeyboardWithKeyRepeatEvent (ref eventHdl : EventHandler, eventType : uint, const keyboardState : p!ubyte)
    |                                                      ^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(27,28)
    | 
27  | def createGame (ref game : Game) 
    |                            ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(39,23)
    | 
39  | def start (ref game : Game)
    |                       ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(53,32)
    | 
53  | def initEvents (ref eventHdl : EventHandler)
    |                                ^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(74,24)
    | 
74  | def onQuit (ref game : Game)
    |                        ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(80,25)
    | 
80  | def onKeyUp (ref game : Game)
    |                         ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(85,27)
    | 
85  | def onKeyDown (ref game : Game)
    |                           ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(90,28)
    | 
90  | def onKeyRight (ref game : Game)
    |                            ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(95,27)
    | 
95  | def onKeyLeft (ref game : Game)
    |                           ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(31,36)
    | 
31  | def createEventHandler (ref game : Game) -> mut EventHandler
    |                                    ^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(31,49)
    | 
31  | def createEventHandler (ref game : Game) -> mut EventHandler
    |                                                 ^^^^^^^^^^^^
Error : Undefined identifier 'KeyboardEvents', maybe 'KeyboardEvent' was meant
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(23,38)
    | 
23  | | keyboardWithKeyRepeatEvents : List!KeyboardEvents // we must use a SDL_Scancode instead of a SDL_Keycode in this case
    |                                      ^^^^^^^^^^^^^^
Error : 'EventHandler' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/./src/game.yr:(14,14)
    | 
14  | | eventHdl : EventHandler
    |              ^^^^^^^^^^^^
Error : 'Game' do not identify a type
 --> /home/ggas/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(11,24)
    | 
11  | | signal : Signal!(ref Game)
    |                        ^^^^
ymir1: erreur interne du compilateur : Erreur de segmentation
0xc477af crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x6a258b semantic::ISymbol::isConst(bool)
        ../../gcc-src/gcc/ymir/Symbol.cc:23
0x74ae4f semantic::ITemplateFrame::getScoreTempOp(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
        ../../gcc-src/gcc/ymir/TemplateFrame.cc:198
0x74d737 semantic::ITemplateFrame::TempOp(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
        ../../gcc-src/gcc/ymir/TemplateFrame.cc:106
0x6e1da3 semantic::IFunctionInfo::TempOp(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&)
        ../../gcc-src/gcc/ymir/FunctionInfo.cc:287
0x687086 syntax::IVar::expression(semantic::ISymbol*)
        ../../gcc-src/gcc/ymir/astExpression.cc:105
0x687227 syntax::IVar::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:126
0x6877db syntax::IPar::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:1073
0x6813d9 syntax::IBinary::affect()
        ../../gcc-src/gcc/ymir/astExpression.cc:508
0x681fc1 syntax::IBinary::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:469
0x70b090 syntax::IVarDecl::instruction()
        ../../gcc-src/gcc/ymir/astInstruction.cc:114
0x709f0c syntax::IBlock::blockWithoutEnter()
        ../../gcc-src/gcc/ymir/astInstruction.cc:52
0x709f95 syntax::IBlock::block()
        ../../gcc-src/gcc/ymir/astInstruction.cc:17
0x6dbc24 semantic::IFrame::validate(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
        ../../gcc-src/gcc/ymir/Frame.cc:139
0x6a213c semantic::IPureFrame::validate()
        ../../gcc-src/gcc/ymir/PureFrame.cc:38
0x726dc8 Ymir::Parser::semantic_time(syntax::IProgram*)
        ../../gcc-src/gcc/ymir/Parser.cc:79
0x726f7f ymir_parse_file
        ../../gcc-src/gcc/ymir/Parser.cc:119
0x726f7f ymir_parse_files(int, char const**)
        ../../gcc-src/gcc/ymir/Parser.cc:106
Veuillez soumettre un rapport d’anomalies complet,
avec la sortie du préprocesseur si nécessaire.
Please include the complete backtrace with any bug report.
Voir <https://gcc.gnu.org/bugs/> pour les instructions.
CMakeFiles/../teelol.dir/build.make:86 : la recette pour la cible « CMakeFiles/../teelol.dir/src/eventHandler.yr.o » a échouée
make[2]: *** [CMakeFiles/../teelol.dir/src/eventHandler.yr.o] Erreur 1
CMakeFiles/Makefile2:67 : la recette pour la cible « CMakeFiles/../teelol.dir/all » a échouée
make[1]: *** [CMakeFiles/../teelol.dir/all] Erreur 2
Makefile:83 : la recette pour la cible « all » a échouée
make: *** [all] Erreur 2

Compilateur crash si problème de permission

Petit bug pas méchant, mais le compilateur crash si un fichier n'est pas accessible (problème de permission):

ymir1: internal compiler error: Segmentation fault
0xc4ffff crash_signal
../../gcc-src/gcc/toplev.c:325
0x6d9377 lexical::Lexer::getWord(Word&)
../../gcc-src/gcc/ymir/Lexer.cc:168
0x6d97c2 lexical::Lexer::get(Word&)
../../gcc-src/gcc/ymir/Lexer.cc:131
0x6d9adb lexical::Lexer::next()
../../gcc-src/gcc/ymir/Lexer.cc:88
0x6d2567 syntax::Visitor::visitProgram()
../../gcc-src/gcc/ymir/Visitor.cc:102
0x72caa3 Ymir::Parser::syntax_analyse()
../../gcc-src/gcc/ymir/Parser.cc:50
0x71b1f0 syntax::IImport::declare()
../../gcc-src/gcc/ymir/astDeclaration.cc:445
0x71d32c syntax::IProgram::declare()
../../gcc-src/gcc/ymir/astDeclaration.cc:347
0x72cdde Ymir::Parser::semantic_time(syntax::IProgram*)
../../gcc-src/gcc/ymir/Parser.cc:63
0x72d00f ymir_parse_file
../../gcc-src/gcc/ymir/Parser.cc:119
0x72d00f ymir_parse_files(int, char const**)
../../gcc-src/gcc/ymir/Parser.cc:106
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See https://gcc.gnu.org/bugs/ for instructions.
ymir1: fatal error: cannot open filename chip.yr: Permission denied

Erreur non gérée (3)

Je tente de me lancer dans les threads :

import core.io;

extern (C) pthread_create (thread : p!uint, attr : p!void, func : fn(p!void) -> p!void, arg : p!void) -> int;

def foo() { println ("test"); }

def main()
{
    pthread_create (null, null, foo, null);
}
Assert : TODO {IInstruction, IExpression, IFuncPtr}
ymir1: erreur interne du compilateur: Erreur de segmentation
0xc18c1f crash_signal
	../../gcc-src/gcc/toplev.c:325
0x6ddfee void Ymir::Error::assert_<>(char const*)
	../../gcc-src/gcc/ymir/errors/Error.hh:286
0x6ddfee Ymir::Error::assert(char const*)
	../../gcc-src/gcc/ymir/Error.cc:825
0x69d045 syntax::IExpression::prettyPrint[abi:cxx11]()
	../../gcc-src/gcc/ymir/astAux.cc:1104
0x6a5ea4 syntax::ITypedVar::prettyPrint[abi:cxx11]()
	../../gcc-src/gcc/ymir/astAux.cc:271
0x6da4eb semantic::IExternFrame::toString[abi:cxx11]()
	../../gcc-src/gcc/ymir/ExternFrame.cc:139
0x6d6cd4 semantic::IFunctionInfo::innerTypeString[abi:cxx11]()
	../../gcc-src/gcc/ymir/FunctionInfo.cc:311
0x6d597d semantic::IFunctionInfo::typeString[abi:cxx11]()
	../../gcc-src/gcc/ymir/FunctionInfo.cc:330
0x69c441 semantic::ISymbol::typeString[abi:cxx11]()
	../../gcc-src/gcc/ymir/Symbol.cc:47
0x6eab7c Ymir::Error::undefinedOp(Word const&, Word const&, semantic::ISymbol*, syntax::IParamList*)
	../../gcc-src/gcc/ymir/Error.cc:698
0x67f795 syntax::IPar::expression()
	../../gcc-src/gcc/ymir/astExpression.cc:974
0x6f8319 syntax::IBlock::blockWithoutEnter()
	../../gcc-src/gcc/ymir/astInstruction.cc:40
0x6f83a5 syntax::IBlock::block()
	../../gcc-src/gcc/ymir/astInstruction.cc:17
0x6d1cc6 semantic::IFrame::validate(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
	../../gcc-src/gcc/ymir/Frame.cc:126
0x69c0ac semantic::IPureFrame::validate()
	../../gcc-src/gcc/ymir/PureFrame.cc:38
0x69bac4 semantic::IPureFrame::validateMain()
	../../gcc-src/gcc/ymir/PureFrame.cc:62
0x69c111 semantic::IPureFrame::validate()
	../../gcc-src/gcc/ymir/PureFrame.cc:32
0x70a71b Ymir::Parser::semantic_time(syntax::IProgram*)
	../../gcc-src/gcc/ymir/Parser.cc:65
0x70a897 ymir_parse_file
	../../gcc-src/gcc/ymir/Parser.cc:101
0x70a897 ymir_parse_files(int, char const**)
	../../gcc-src/gcc/ymir/Parser.cc:88

Segfault du compilo avec utilisation des tuples (exemple de la doc)

Tout est dans le titre ! Le problème semble principalement venir de la fonction reverse.

import core.io;

def reverse (a : t!(uint, bool)) -> t!(bool, uint) {
    let (r, v) = a;
    return (v, r);
}

def simple (a : uint, b : bool, c : string) {
    println (a, ' ', b, ' ', c);
}

def main () {
    let tuple = (1UB, "salut", 'r');

    // Values can be extracted from tuple using index
    println ("tuple first value ", tuple.0);
    println ("tuple second value ", tuple.1);

    // Tuple can be tuple member
    let mult = ((1, 2), (4, 5));
    println (mult);

    let pair = (1U, true);
    println (reverse (pair), " is reversed");

    // Tuple can be expand to function parameters
    simple (expand (pair), "salut");

    // To create an tuple with only one value
    println ((1,), " is a tuple");
    println ((1), " is an integer");

    // Tuple can be destructured
    let (a, b...) = tuple;
    println (b, " is a tuple and ", a, " is an ubyte");
}

Erreurs louches

Voir issue : https://github.com/GNU-Ymir/Ymir-Test/tree/master/issues/issue_33

Error : Incompatible types 'src.eventHandler.EventHandler' and 'src.eventHandler.EventHandler'
 --> /home/guillaume/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(31,5)
    | 
31  |     return EventHandler { listClassicEvent, listKeyboardEvent, sdlEvent };
    |     ^^^^^^
Error : Operator '()' is undefined for type 'function <std.list.push> (ref a : List!(T), const b : T)' and (std.list.List!(src.eventHandler.ClassicEvent), src.eventHandler.ClassicEvent)
 --> /home/guillaume/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(36,33)
    | 
36  |     eventHdl.classicEvents.push (ClassicEvent { eventType, signal });
    |                                 ^                                  ^
Error : Operator '()' is undefined for type 'function <std.list.push> (ref a : List!(T), const b : T)' and (std.list.List!(src.eventHandler.KeyboardEvent), src.eventHandler.KeyboardEvent)
 --> /home/guillaume/Documents/ymir/Ymir-Test/sdl/Teelol/src/eventHandler.yr:(41,34)
    | 
41  |     eventHdl.keyboardEvents.push (KeyboardEvent { eventType, keyCode, signal });
    |                                  ^                                            ^
ymir1: erreur fatale : NB Error : 3
compilation terminée.
CMakeFiles/../teelol.dir/build.make:86 : la recette pour la cible « CMakeFiles/../teelol.dir/src/eventHandler.yr.o » a échouée
make[2]: *** [CMakeFiles/../teelol.dir/src/eventHandler.yr.o] Erreur 1
CMakeFiles/Makefile2:67 : la recette pour la cible « CMakeFiles/../teelol.dir/all » a échouée
make[1]: *** [CMakeFiles/../teelol.dir/all] Erreur 2
Makefile:83 : la recette pour la cible « all » a échouée
make: *** [all] Erreur 2

L'opérateur ++ s'effectue trop tôt

Généralement, dans le cas d'un affectation par exemple, on réalise d'abord l'affectation puis le ++. Exemple :

let a = 0, b = 1;
for (i in 0U .. 10U)
    a = b++; // on doit d'abord faire a = b, puis b++;

Tu comptes reproduire ce comportement ? Et introduire le ++var par exemple ?

Parce que ça faisait longtemps...

Bim Bam Boum, resource.yr, quand j'ai ajouté le "const" dans la structure SurfaceRes.

https://github.com/GNU-Ymir/Ymir-Test/tree/master/issues/issue_38/Teelol

<interne>: Dans la fonction «src.resource.self»:
<interne>: erreur : conversion invalide dans un appel gimple
struct std.list.List!(src.resource.ImageRes)

struct std.list.List!(src.resource.ImageRes)

src8resource15gImagesPathList = std.list.src.resource.list ();
<interne>: erreur interne du compilateur : verify_gimple a échoué
0xc924ad verify_gimple_in_seq(gimple*)
        ../../gcc-src/gcc/tree-cfg.c:5247
0x9bdf55 gimplify_body(tree_node*, bool)
        ../../gcc-src/gcc/gimplify.c:12710
0x9be2d4 gimplify_function_tree(tree_node*)
        ../../gcc-src/gcc/gimplify.c:12800
0x7092cd semantic::IFinalFrame::finalize()
        ../../gcc-src/gcc/ymir/FinalFrame.cc:203
0x72aa6b Ymir::Parser::lint_time()
        ../../gcc-src/gcc/ymir/Parser.cc:90
0x72ab87 ymir_parse_file
        ../../gcc-src/gcc/ymir/Parser.cc:120
0x72ab87 ymir_parse_files(int, char const**)
        ../../gcc-src/gcc/ymir/Parser.cc:106
Veuillez soumettre un rapport d’anomalies complet,
avec la sortie du préprocesseur si nécessaire.
Please include the complete backtrace with any bug report.
Voir <https://gcc.gnu.org/bugs/> pour les instructions.
CMakeFiles/../teelol.dir/build.make:254 : la recette pour la cible « CMakeFiles/../teelol.dir/src/resource.yr.o » a échouée
make[2]: *** [CMakeFiles/../teelol.dir/src/resource.yr.o] Erreur 1
CMakeFiles/Makefile2:67 : la recette pour la cible « CMakeFiles/../teelol.dir/all » a échouée
make[1]: *** [CMakeFiles/../teelol.dir/all] Erreur 2
Makefile:83 : la recette pour la cible « all » a échouée
make: *** [all] Erreur 2

Simplifier les matchs

Maintenant que les blocs sont des expressions, le code des matchs n'a plus besoin d'être aussi compliqué.

Erreur avec mauvais type de param et utilisateur dans un enum

imut SDLK_SCANCODE_MASK = (1 << 30);

def SdlScanCodeToKeyCode (code : uint) -> int {
    return (code | SDLK_SCANCODE_MASK);
}

enum SDL_Scancode {
    SDL_SCANCODE_UP : 82
}
enum SDL_Keycode {
    SDLK_UP : SdlScanCodeToKeyCode (SDL_Scancode::SDL_SCANCODE_UP)
}
 12%] Building C object CMakeFiles/../teelol.dir/src/lib/sdl.yr.o
Error : Operator '()' is undefined for type 'function <src.lib.sdl.SdlScanCodeToKeyCode> (code : uint)-> int' and (const(src.lib.sdl.SDL_Scancode(int)))
 --> /home/guillaume/Documents/ymir/Ymir-Test/sdl/Teelol/src/lib/sdl.yr:(185,36)
    | 
185 |     SDLK_UP : SdlScanCodeToKeyCode (SDL_Scancode::SDL_SCANCODE_UP)
    |                                    ^                             ^
ymir1: erreur interne du compilateur : Erreur de segmentation
0xc4788f crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x70e6b0 syntax::IEnum::declare()
        ../../gcc-src/gcc/ymir/astDeclaration.cc:619
0x71537c syntax::IProgram::declare()
        ../../gcc-src/gcc/ymir/astDeclaration.cc:347
0x726dce Ymir::Parser::semantic_time(syntax::IProgram*)
        ../../gcc-src/gcc/ymir/Parser.cc:63
0x726fff ymir_parse_file
        ../../gcc-src/gcc/ymir/Parser.cc:119
0x726fff ymir_parse_files(int, char const**)
        ../../gcc-src/gcc/ymir/Parser.cc:106
Veuillez soumettre un rapport d’anomalies complet,
avec la sortie du préprocesseur si nécessaire.
Please include the complete backtrace with any bug report.
Voir <https://gcc.gnu.org/bugs/> pour les instructions.
CMakeFiles/../teelol.dir/build.make:134 : la recette pour la cible « CMakeFiles/../teelol.dir/src/lib/sdl.yr.o » a échouée
make[2]: *** [CMakeFiles/../teelol.dir/src/lib/sdl.yr.o] Erreur 1
CMakeFiles/Makefile2:67 : la recette pour la cible « CMakeFiles/../teelol.dir/all » a échouée
make[1]: *** [CMakeFiles/../teelol.dir/all] Erreur 2
Makefile:83 : la recette pour la cible « all » a échouée
make: *** [all] Erreur 2

Erreur affichage des floats

J'ai toujours 0 quand je veux afficher des floats.
J'ai modifié la core pour vérifier que je passais bien dans la bonne fonction de print, et c'est le cas (si je met %d j'ai une valeur de merde). J'ai testé %f au lieux de %lf, rien à faire, toujours 0, c'est bien le bon format pourtant d'après la doc...

Le code de test :

import core.io;

// A structure with two fields
struct Point {
    x : float,
    y : float
}

// Struct can be field of another struct
struct
| a : Point
| b : Point
 -> Rectangle;

def printRect (ref rect : Rectangle)
{
    println (rect.a.x, ", ", rect.a.y);
    println (rect.b.x, ", ", rect.b.y);
}

def main () {
    // all values are needed
    let point = Point { .1f, .7f };
    println (point);
    println (point.x);

    let a = .7f;
    println (a);
    
    // A struct can be constructed without value either
    // All fields are set two 0x0.
    let point2 = Point::init; 

    // We can get a tuple from a structure
    // let (x, y) = point.tupleof;

    let rect = Rectangle { point, Point {3.3f, 4.5f } };

    // Structure are printable.
    println (rect);
    printRect (rect);
}

Ref pour les pointeur sur fonction

On peut pas spécifier une référence pour les types dans le pointeurs sur fonction :

def foo (ref a : int) -> int {
   a++;
    return a + 1;
}

let a = fn (ref int) -> int (foo);

Segfault avec utilisation des listes (std modifiée)

J'ai ajouté deux fonctions permettant de parcourir une liste, attention std modifiée du coup j'ai également partagé runtime.

https://github.com/GNU-Ymir/Ymir-Test/tree/master/issues/issue_16

ymir1: erreur interne du compilateur : Erreur de segmentation
0xc306cf crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x7475d8 semantic::IStructInfo::getTemplate(unsigned long)
        ../../gcc-src/gcc/ymir/StructInfo.cc:648
0x72fb33 semantic::TemplateSolver::solveInside(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&, syntax::IVar*, semantic::IInfoType*)
        ../../gcc-src/gcc/ymir/TemplateSolver.cc:180
0x730e3a semantic::TemplateSolver::solveInside(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&, syntax::IVar*, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/TemplateSolver.cc:224
0x736344 semantic::TemplateSolver::solve(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&, syntax::IVar*, semantic::IInfoType*)
        ../../gcc-src/gcc/ymir/TemplateSolver.cc:112
0x73ab92 semantic::ITemplateFrame::getScoreSimple(Word, std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/TemplateFrame.cc:237
0x73b4a8 semantic::ITemplateFrame::isApplicableSimple(Word, std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/TemplateFrame.cc:300
0x73b72d semantic::ITemplateFrame::isApplicable(Word, std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/TemplateFrame.cc:40
0x7378f6 semantic::ITemplateFrame::isApplicable(syntax::IParamList*)
        ../../gcc-src/gcc/ymir/TemplateFrame.cc:44
0x6d8d97 semantic::IFunctionInfo::CallOp(Word, syntax::IParamList*)
        ../../gcc-src/gcc/ymir/FunctionInfo.cc:215
0x68390d syntax::IPar::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:1031
0x67dea9 syntax::IBinary::affect()
        ../../gcc-src/gcc/ymir/astExpression.cc:468
0x67ea61 syntax::IBinary::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:429
0x6fe7a0 syntax::IVarDecl::instruction()
        ../../gcc-src/gcc/ymir/astInstruction.cc:102
0x6fd759 syntax::IBlock::blockWithoutEnter()
        ../../gcc-src/gcc/ymir/astInstruction.cc:40
0x6fd7e5 syntax::IBlock::block()
        ../../gcc-src/gcc/ymir/astInstruction.cc:17
0x6d2862 semantic::IFrame::validate(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
        ../../gcc-src/gcc/ymir/Frame.cc:133
0x69c37c semantic::IPureFrame::validate()
        ../../gcc-src/gcc/ymir/PureFrame.cc:38
0x6d9250 semantic::IFunctionInfo::CallOp(Word, syntax::IParamList*)
        ../../gcc-src/gcc/ymir/FunctionInfo.cc:251
0x68390d syntax::IPar::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:1031

Pas le résultat prévu sur itérateur tableau

D'après la doc, les itérateurs sont des références, est-ce toujours le cas ? Dans cet exemple ça ne fonctionne que sur la première valeur, puis le reste du tableau a la même valeur que la première.

import core.io;

def main () {
    let a = [1, 2, 3];
    
    // The iterator is a reference 
    for it in a {
        it = it + 1;
    }
    
    println (a); // [2, 3, 4] expected but [2, 2, 2] is print
}

Conversion invalide dans un appel gimple !

<interne>: Dans la fonction «server.clientHandlerThread»:
<interne>: erreur : conversion invalide dans un appel gimple
struct char[]

struct char[]

nickname = server.recvMessageOnSocket (_1);
<interne>: erreur interne du compilateur : verify_gimple a échoué
0xc768bd verify_gimple_in_seq(gimple*)
        ../../gcc-src/gcc/tree-cfg.c:5247
0x9a3615 gimplify_body(tree_node*, bool)
        ../../gcc-src/gcc/gimplify.c:12710
0x9a3994 gimplify_function_tree(tree_node*)
        ../../gcc-src/gcc/gimplify.c:12800
0x6f9961 semantic::IFinalFrame::finalize()
        ../../gcc-src/gcc/ymir/FinalFrame.cc:203
0x715f1b Ymir::Parser::lint_time()
        ../../gcc-src/gcc/ymir/Parser.cc:87
0x716037 ymir_parse_file
        ../../gcc-src/gcc/ymir/Parser.cc:117
0x716037 ymir_parse_files(int, char const**)
        ../../gcc-src/gcc/ymir/Parser.cc:103
mod server;

import core.io;
import std.conv;
import std.socket;
import std.list;
import std.memory;

extern (C) pthread_create (thread : p!ulong, attr : p!void, func : fn(p!void) -> p!void, arg : p!void) -> int;

extern (C) pthread_join (th : ulong, a : p!(p!(void)));
extern (C) pthread_exit (a : int);
extern (C) sleep (a : int);

enum
| InvalidSocket : -1
 -> SockResCode;

enum
| Error : -1
| Success : 0
 -> RetCode;

struct
| sock : int
| nickname : string
 -> User;

static clientsList : List!User;

def main(args) -> int
{
    let port = 8888US;
    let retCode = RetCode::Success;

    if (args.len > 1u)
    {
        port = to!ushort(args[1]);
    }
    
    let sockServer = socket (cast!int(AddrFamily::AfInet), SocketType::SockStream, 0);
    if (sockServer == SockResCode::InvalidSocket)
    {
        println("Error while creating the socket.");
        return RetCode::Error;
    }
    else
    {
        println("Socket created !");
    }

    let serverAddr = SockAddrIn::init;
    serverAddr.sin_family = cast!short (AddrFamily::AfInet);
    serverAddr.sin_addr.s_addr = AddrType::InAddrAny;
    serverAddr.sin_port = htons (port);
    
    let res = bind (sockServer, cast!(p!SockAddr) (&serverAddr), SockAddrIn::sizeof);
    if (res < 0)
    {
        println (("Bind error : ", res));
        retCode = RetCode::Error;
    }
    else
    {
        if (listen (sockServer, 3) < 0)
        {
            println ("Listen error");
            retCode = RetCode::Error;
        }
        else
        {
            println ("Waiting for incoming connections...");
            
            let clientAddr = SockAddrIn::init;
            let lenAddr = SockAddrIn::sizeof;
            
            while (true) {
                let clientSock = accept (sockServer, cast!(p!SockAddr) (&clientAddr), cast!(p!uint) (&lenAddr));

                if (clientSock < 0)
                {
                    println ("Accept error");
                    retCode = RetCode::Error;                
                }
                else
                {
                    println (("Client ", clientSock, " connected !"));
                    
                    startClientThread (clientSock);
                }
            }
        }
    }
    
    close (sockServer);
    return retCode;
}

def startClientThread (sock : int)
{
    let th = 0UL;
    let arg = alloc (sock);
    pthread_create (&th, null, clientHandlerThread, cast!(p!void)(arg));
}

def clientHandlerThread(arg : p!void) -> p!void
{
    let sock = cast!(p!int)(arg);

    let nickname = recvMessageOnSocket (*sock);
    clientsList.push (User { *sock, nickname });

    while (recvMessage(*sock)) {}
    println (("Client ", *sock, "(", nickname, ") disconnected !"));
    return null;
}

def recvMessage (sock : int) -> bool
{
    let message = recvMessageOnSocket (sock);
    if (message.len > 0)
    {
        println (message);
        return true;
    }
    return false;
}

def recvMessageOnSocket (sock : int) -> mut string
{    
    let messageSize = uint::init;
    let readSize = recv (sock, cast!(p!void) (&messageSize), cast!int(uint::sizeof), 0u);
    let emptyStringTmp = [char ; 0U];
    
    if (readSize <= 0)
        return emptyStringTmp;
    
    let message = [char ; messageSize];
    readSize = recv (sock, cast!(p!void) (message.ptr), cast!int(messageSize), 0u);

    if (readSize < 0)
        return emptyStringTmp;

    if (readSize > 0)
        return message;
    return emptyStringTmp;
}
mod std.socket;

public
{
    extern (C) socket (addrFamily : int, socketType : int, protocol : int) -> int;
    extern (C) close (fd : int) -> int;
    extern (C) htons (host : ushort) -> ushort;
    extern (C) connect (socket : int, serverAddr : p!SockAddr, len : uint) -> int;
    extern (C) inet_addr (const c : p!char) -> uint;
    extern (C) send (sock : int, buf : const p!void, len : const uint, flags : const int) -> int;
    extern (C) recv (s : int, buf : p!void, len : int, flags : uint) -> int;
    extern (C) listen (s : int, backlog : int) -> int;
    extern (C) bind (sockfd : int, my_addr : p!SockAddr, addrlen : uint) -> int;
    extern (C) accept (sock : int, addr : p!SockAddr, addlen : p!uint) -> int;
}

struct
| s_addr : uint
 -> InAddr;

struct
| sin_family : short
| sin_port : ushort
| sin_addr : InAddr
| sin_zero : [char ; 8u]
 -> SockAddrIn;

struct
| sa_family : ushort
| sa_data : [char ; 14u]
 -> SockAddr;

/* TODO : complete this enum by using socket.h */
enum
| AfInet : 2	/* Internet IP Protocol */
 -> AddrFamily;

/* TODO : complete this enum by using socket.h */
enum
| SockStream : 1 /* stream (connection) socket) */
 -> SocketType;

enum : uint
| InAddrAny : 0U /* linux/in.h */
 -> AddrType;

Segfault avec imut float

Pas réussi à repro avec un exemple simple, donc j'ai dupliqué Teelol une fois de plus.

https://github.com/GNU-Ymir/Ymir-Test/tree/master/issues/issue_41

[  8%] Building C object CMakeFiles/../teelol.dir/src/player.yr.o
ymir1: erreur interne du compilateur : Erreur de segmentation
0xc5302f crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x70bcbc semantic::IFloatValue* semantic::IValue::to<semantic::IFloatValue>()
        ../../gcc-src/gcc/ymir/semantic/value/Value.hh:53
0x70bcbc semantic::IFloatValue::mul(semantic::IValue*)
        ../../gcc-src/gcc/ymir/FloatInfo.cc:562
0x70c668 semantic::IFloatValue::BinaryOp(Word, semantic::IValue*)
        ../../gcc-src/gcc/ymir/FloatInfo.cc:502
0x70a5c8 semantic::IFloatInfo::opNorm(Word, syntax::IExpression*)
        ../../gcc-src/gcc/ymir/FloatInfo.cc:324
0x70ad70 semantic::IFloatInfo::BinaryOp(Word, syntax::IExpression*)
        ../../gcc-src/gcc/ymir/FloatInfo.cc:43
0x70b0d2 semantic::IFloatInfo::BinaryOp(Word, syntax::IExpression*)
        /usr/include/c++/7/ext/new_allocator.h:125
0x684ba8 syntax::IBinary::normal()
        ../../gcc-src/gcc/ymir/astExpression.cc:629
0x685054 syntax::IBinary::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:507
0x6850b8 syntax::IBinary::expression()
        /usr/include/c++/7/bits/basic_string.h:220
0x684ade syntax::IBinary::normal()
        ../../gcc-src/gcc/ymir/astExpression.cc:621
0x685054 syntax::IBinary::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:507
0x6850b8 syntax::IBinary::expression()
        /usr/include/c++/7/bits/basic_string.h:220
0x684ade syntax::IBinary::normal()
        ../../gcc-src/gcc/ymir/astExpression.cc:621
0x685054 syntax::IBinary::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:507
0x6850b8 syntax::IBinary::expression()
        /usr/include/c++/7/bits/basic_string.h:220
0x684aee syntax::IBinary::normal()
        ../../gcc-src/gcc/ymir/astExpression.cc:621
0x685054 syntax::IBinary::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:507
0x6850b8 syntax::IBinary::expression()
        /usr/include/c++/7/bits/basic_string.h:220
0x6886e9 syntax::ICast::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:816

Segfault pendant la compilation

J'étais en train d'essayer de compiler mon premier lancé de code, et ça me pète à la gueule :

(Copie du code + output ici : https://github.com/GNU-Ymir/Ymir-Test/tree/master/issues/issue_31

gyc main.yr game.yr screen.yr sdl.yr -lSDL2 -lSDL2main
Error : Undefined identifier 'SDL_Window'
 --> screen.yr:(10,14)
    | 
10  | | window : p!SDL_Window
    |              ^^^^^^^^^^
Error : 'Screen' do not identify a type
 --> game.yr:(6,12)
    | 
 6  | | screen : Screen
    |            ^^^^^^
Error : 'Game' do not identify a type
 --> game.yr:(16,22)
    | 
16  | def createGame () -> Game
    |                      ^^^^
ymir1: erreur interne du compilateur : Erreur de segmentation
0xc436af crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x6e11f8 semantic::IExternFrame::validate()
        ../../gcc-src/gcc/ymir/ExternFrame.cc:69
0x723b20 Ymir::Parser::semantic_time(syntax::IProgram*)
        ../../gcc-src/gcc/ymir/Parser.cc:79
0x723cdf ymir_parse_file
        ../../gcc-src/gcc/ymir/Parser.cc:119
0x723cdf ymir_parse_files(int, char const**)
        ../../gcc-src/gcc/ymir/Parser.cc:106
Veuillez soumettre un rapport d’anomalies complet,
avec la sortie du préprocesseur si nécessaire.
Please include the complete backtrace with any bug report.
Voir <https://gcc.gnu.org/bugs/> pour les instructions.
Error : Undefined identifier 'SDL_Window'
 --> screen.yr:(10,14)
    | 
10  | | window : p!SDL_Window
    |              ^^^^^^^^^^
Error : 'Screen' do not identify a type
 --> game.yr:(6,12)
    | 
 6  | | screen : Screen
    |            ^^^^^^
Error : Operator '()' is undefined for type 'function <screen.createScreen> (title : string, windowWidth : uint, windowHeight : uint, windowPosX : uint, windowPosY : uint)-> Screen' and (const([char]), const(uint), const(uint), const(uint), const(uint))
 --> game.yr:(18,31)
    | 
18  |     let screen = createScreen (Title, WindowWidth, WindowHeight, WindowPosX, WindowPosY);
    |                               ^                                                        ^
Error : Variable 'screen' has no type
 --> game.yr:(19,19)
    | 
19  |     return Game { screen };
    |                   ^^^^^^
Error : No property 'screen' for type 'const(ref(game.Game))'
 --> game.yr:(25,13)
    | 
25  |         game.screen.display();
    |             ^
ymir1: erreur fatale : NB Error : 5
compilation terminée.
Error : Operator '()' is undefined for type 'function <sdl.SDL_CreateWindow> (const title : p!(char), x : int, y : int, w : int, h : int, flags : uint)-> p!(SDL_Window)' and (ptr!char, uint, uint, uint, uint, const(sdl.SDL_WindowFlag(uint)))
 --> screen.yr:(24,38)
    | 
24  |     screen.window = SDL_CreateWindow (title.ptr, windowWidth, windowHeight, windowPosX, windowPosY, SDL_WindowFlag::Shown);
    |                                      ^                                                                                   ^
Error : Undefined identifier 'windowWith'
 --> screen.yr:(41,48)
    | 
41  |     SDL_RenderSetLogicalSize (screen.renderer, windowWith, windowHeight);
    |                                                ^^^^^^^^^^
Error : Missing return statement for function 'createScreen' expecting a value of type 'const(screen.Screen)'
 --> screen.yr:(15,5)
    | 
15  | def createScreen (title : string, windowWidth : uint, windowHeight : uint, windowPosX : uint, windowPosY : uint) -> Screen
    |     ^^^^^^^^^^^^
Error : Undefined identifier 'renderer'
 --> screen.yr:(52,30)
    | 
52  |         SDL_DestroyRenderer (renderer);
    |                              ^^^^^^^^
Error : Undefined identifier 'window'
 --> screen.yr:(54,28)
    | 
54  |         SDL_DestroyWindow (window);
    |                            ^^^^^^
ymir1: erreur fatale : NB Error : 5
compilation terminée.

Segfault du compilo si on donne un entier signé en taille de tableau

Voir ligne 23, je calcul une taille de tableau, j'ajoute 1 à cette taille (donc entier signé), et après m'avoir affiché l'erreur correspondante il segfault.

import core.io;
import std.memory;

def indexOf (const baseStr : string, const str : string) -> int {
    let strIndex = 0;
    let baseStrIndex = 0;
    let resIndex = 0;
    
    while (baseStrIndex < baseStr.len && strIndex < str.len) {
        if (baseStr[baseStrIndex] == str[strIndex]) {
            if (strIndex == 0U)
                resIndex = baseStrIndex;
            strIndex++;
        } else {
            resIndex = -1;
        }
        baseStrIndex++;
    }
    return resIndex;
}

def substr (const str : string, const beginIndex : uint, const endIndex : uint) -> string {
    let res = [char ; (endIndex - beginIndex) + 1]; // ICI
    memset (cast!(p!byte)(res.ptr), res.len, cast!byte('A'));
    return string { res.len , res.ptr };
}

def main () {
    let a = "test";
    let b = "sdf";
    println (a.indexOf(b));
    println (a.substr (0U, 2U));
    
}
Error : Undefined identifier 'opBinary'
 --> test.yr:(23,47)
    | 
23  |     let res = [char ; (endIndex - beginIndex) + 1];
    |                                               ^^^^^^^^

Error : Operator '+' between types 'const(uint)' and 'const(int)' doesn't exist
 --> test.yr:(23,47)
    | 
23  |     let res = [char ; (endIndex - beginIndex) + 1];
    |                                               ^
ymir1: erreur interne du compilateur : Erreur de segmentation
0xc2c02f crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x69e743 syntax::IArrayAlloc::IArrayAlloc(Word, syntax::IExpression*, syntax::IExpression*, bool)
        ../../gcc-src/gcc/ymir/astAux.cc:373
0x6810a4 syntax::IArrayAlloc::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:348
0x67dd69 syntax::IBinary::affect()
        ../../gcc-src/gcc/ymir/astExpression.cc:466
0x67e921 syntax::IBinary::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:427
0x6fc560 syntax::IVarDecl::instruction()
        ../../gcc-src/gcc/ymir/astInstruction.cc:102
0x6fb519 syntax::IBlock::blockWithoutEnter()
        ../../gcc-src/gcc/ymir/astInstruction.cc:40
0x6fb5a5 syntax::IBlock::block()
        ../../gcc-src/gcc/ymir/astInstruction.cc:17
0x6d2a72 semantic::IFrame::validate(std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&)
        ../../gcc-src/gcc/ymir/Frame.cc:129
0x69b56c semantic::IPureFrame::validate()
        ../../gcc-src/gcc/ymir/PureFrame.cc:38
0x713d50 Ymir::Parser::semantic_time(syntax::IProgram*)
        ../../gcc-src/gcc/ymir/Parser.cc:77
0x713eff ymir_parse_file
        ../../gcc-src/gcc/ymir/Parser.cc:116
0x713eff ymir_parse_files(int, char const**)
        ../../gcc-src/gcc/ymir/Parser.cc:103

Segfault sur erreur de frappe sur un type dans un param d'extern (C)

import core.io;

extern (C) socket (addrFamily : int, socketType : int, protocol : int) -> int;
extern (C) close (fd : int) -> int;
extern (C) recv (s : int, buf : p!void, len : int, flags : uint) -> int;
extern (C) listen (s : int, backlog : int) -> int;
extern (C) bind (sockfd : int, my_addr : p!Sockaddr, addrlen : uint) -> int;
extern (C) accept (sock : int, addr : p!Sockaddr, addlrn : uint) -> int;
extern (C) htons (host : ushort) -> ushort;

struct
| s_addr : uint
 -> InAddr;

struct
| sin_len : ubyte
| sin_family : ushort
| sin_port : ushort
| sin_addr : InAddr
| sin_zero : [ubyte ; 8U]
 -> SockAddrIn;

struct
| sa_len : ubyte
| sa_family : p!void
| sa_data : [ubyte ; 14U]
 -> SockAddr;

/* TODO : complete this enum by using socket.h */
enum
| AfInet : 2US	/* Internet IP Protocol */
 -> AddrFamily;

/* TODO : complete this enum by using socket.h */
enum
| SockStream : 1 /* stream (connection) socket) */
 -> SocketType;

enum
| InvalidSocket : -1
 -> SockResCode;

enum : uint
| InAddrAny : 0U /* linux/in.h */
 -> AddrType;

def main()
{
    let imut Port = 8888US;
    
    let sock = socket (cast!int(AddrFamily::AfInet), SocketType::SockStream, 0);
    if (sock == SockResCode::InvalidSocket)
    {
        println("Error while creating the socket.");
        return -1;
    }
    else
    {
        println("Socket created !");
    }

    let server = SockAddrIn::init;
    server.sin_family = AddrFamily::AfInet;
    server.sin_addr.s_addr = AddrType::InAddrAny;
    server.sin_port = htons (Port);

    if (bind (sock, cast!(p!SockAddr) (&server), SockAddrIn::sizeof) < 0)
    {
        close (sock);
        println ("Bind error");
        return -1;
    }
    
    close (sock);
    return 0;
}

Segfault du compilo avec erreur de syntaxe

L'erreur de syntaxe suivante fait segfault le compilo (quoi que l'erreur semble détectée, mais mal gérée ?) :

import std.string;

def test (a : [(string, string)]) { }

def main()
{
    let a = test ([("a", "a"]); //syntax error !
}
Assert : [')' ','] expected, when ] found
 --> test.yr:(7,29)
    | 
 7  |     let a = test ([("a", "a"]);
    |                             ^
s
ymir1: erreur interne du compilateur : Erreur de segmentation
0xc926ff crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x715637 void Ymir::Error::assert_<char const*>(char const*, char const*)
        ../../gcc-src/gcc/ymir/errors/Error.hh:376
0x715637 void Ymir::Error::assert<char const*>(char const*, char const*)
        ../../gcc-src/gcc/ymir/errors/Error.hh:311
0x715637 Ymir::Error::syntaxError(Word const&, char const*)
        ../../gcc-src/gcc/ymir/Error.cc:568
0x6f30be lexical::Lexer::next(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)
        ../../gcc-src/gcc/ymir/Lexer.cc:121
0x6d444d syntax::Visitor::visitPthPar(Word const&)
        ../../gcc-src/gcc/ymir/Visitor.cc:1627
0x6d4d74 syntax::Visitor::visitPth()
        ../../gcc-src/gcc/ymir/Visitor.cc:1594
0x6d4f97 syntax::Visitor::visitHigh()
        ../../gcc-src/gcc/ymir/Visitor.cc:1564
0x6d5247 syntax::Visitor::visitLow()                                                                                                                                                                                             
        ../../gcc-src/gcc/ymir/Visitor.cc:1545                                                                                                                                                                                   
0x6d56b7 syntax::Visitor::visitUlow()                                                                                                                                                                                            
        ../../gcc-src/gcc/ymir/Visitor.cc:1503                                                                                                                                                                                   
0x6d5ab7 syntax::Visitor::visitExpression()                                                                                                                                                                                      
        ../../gcc-src/gcc/ymir/Visitor.cc:1484                                                                                                                                                                                   
0x6d8ed5 syntax::Visitor::visitConstArray()                                                                                                                                                                                      
        ../../gcc-src/gcc/ymir/Visitor.cc:2095                                                                                                                                                                                   
0x6eccf7 syntax::Visitor::visitLeftOp()                                                                                                                                                                                          
        ../../gcc-src/gcc/ymir/Visitor.cc:2001                                                                                                                                                                                   
0x6ecedf syntax::Visitor::visitPthWPar(Word&)                                                                                                                                                                                    
        ../../gcc-src/gcc/ymir/Visitor.cc:1988                                                                                                                                                                                   
0x6d4de4 syntax::Visitor::visitPth()                                                                                                                                                                                             
        ../../gcc-src/gcc/ymir/Visitor.cc:1598                                                                                                                                                                                   
0x6d4f97 syntax::Visitor::visitHigh()                                                                                                                                                                                            
        ../../gcc-src/gcc/ymir/Visitor.cc:1564                                                                                                                                                                                   
0x6d5247 syntax::Visitor::visitLow()                                                                                                                                                                                             
        ../../gcc-src/gcc/ymir/Visitor.cc:1545                                                                                                                                                                                   
0x6d56b7 syntax::Visitor::visitUlow()                                                                                                                                                                                            
        ../../gcc-src/gcc/ymir/Visitor.cc:1503
0x6d5ab7 syntax::Visitor::visitExpression()
        ../../gcc-src/gcc/ymir/Visitor.cc:1484
0x6d846f syntax::Visitor::visitPar(syntax::IExpression*)
        ../../gcc-src/gcc/ymir/Visitor.cc:2314

Question syntaxe enum

Il serait possible de pouvoir déclarer un enum sans indiquer de valeur pour que élément ? (Et par défaut compter à partir de 0).

Segfault compilo avec exemple de map dans la runtime

L'exemple de map dans la runtime provoque un segfault du compilo :

Code : https://github.com/GNU-Ymir/yruntime/tree/master/examples/map

ymir1: erreur interne du compilateur : Erreur de segmentation
0xc4454f crash_signal
        ../../gcc-src/gcc/toplev.c:325
0x73f62a semantic::IRefInfo* semantic::IInfoType::to<semantic::IRefInfo>()
        ../../gcc-src/gcc/ymir/semantic/types/InfoType.hh:232
0x73f62a semantic::TemplateSolver::solveInside(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&, syntax::IVar*, semantic::IInfoType*)
        ../../gcc-src/gcc/ymir/TemplateSolver.cc:190
0x741410 semantic::TemplateSolver::solveInside(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&, syntax::IVar*, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/TemplateSolver.cc:268
0x7459f6 semantic::TemplateSolver::solve(std::vector<syntax::IExpression*, std::allocator<syntax::IExpression*> > const&, syntax::IVar*, semantic::IInfoType*)
        ../../gcc-src/gcc/ymir/TemplateSolver.cc:142
0x74a3f2 semantic::ITemplateFrame::getScoreSimple(Word, std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/TemplateFrame.cc:237
0x74ad58 semantic::ITemplateFrame::isApplicableSimple(Word, std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/TemplateFrame.cc:304
0x74afdd semantic::ITemplateFrame::isApplicable(Word, std::vector<syntax::IVar*, std::allocator<syntax::IVar*> > const&, std::vector<semantic::IInfoType*, std::allocator<semantic::IInfoType*> > const&)
        ../../gcc-src/gcc/ymir/TemplateFrame.cc:40
0x747166 semantic::ITemplateFrame::isApplicable(syntax::IParamList*)
        ../../gcc-src/gcc/ymir/TemplateFrame.cc:44
0x6e0107 semantic::IFunctionInfo::CallOp(Word, syntax::IParamList*)
        ../../gcc-src/gcc/ymir/FunctionInfo.cc:216
0x686fd8 syntax::IPar::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:1074
0x67fbc7 syntax::IAccess::findOpAccess()
        ../../gcc-src/gcc/ymir/astExpression.cc:64
0x68332f syntax::IAccess::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:38
0x6813d9 syntax::IBinary::affect()
        ../../gcc-src/gcc/ymir/astExpression.cc:506
0x681fd1 syntax::IBinary::expression()
        ../../gcc-src/gcc/ymir/astExpression.cc:467
0x7077dc syntax::IBlock::blockWithoutEnter()
        ../../gcc-src/gcc/ymir/astInstruction.cc:52
0x707865 syntax::IBlock::block()
        ../../gcc-src/gcc/ymir/astInstruction.cc:17
0x707c3e syntax::IFor::instruction()
        ../../gcc-src/gcc/ymir/astInstruction.cc:263
0x7077dc syntax::IBlock::blockWithoutEnter()
        ../../gcc-src/gcc/ymir/astInstruction.cc:52
0x707865 syntax::IBlock::block()
        ../../gcc-src/gcc/ymir/astInstruction.cc:17
Veuillez soumettre un rapport d’anomalies complet,
avec la sortie du préprocesseur si nécessaire.
Please include the complete backtrace with any bug report.
Voir <https://gcc.gnu.org/bugs/> pour les instructions.

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.