public override void AddDeclarationToBlock(BlockContext context)
        {
            var fdef  = this;
            var block = context.Block;

            if (context.MakeCType(fdef.Specifiers, fdef.Declarator, null, block) is CFunctionType ftype)
            {
                var name = fdef.Declarator.DeclaredIdentifier;
                var f    = new CompiledFunction(name, ftype, fdef.Body);
                block.Functions.Add(f);
            }
        }
        public override void AddDeclarationToBlock(BlockContext context)
        {
            var multi = this;
            var block = context.Block;

            if (multi.InitDeclarators != null)
            {
                foreach (var idecl in multi.InitDeclarators)
                {
                    if ((multi.Specifiers.StorageClassSpecifier & StorageClassSpecifier.Typedef) != 0)
                    {
                        var name  = idecl.Declarator.DeclaredIdentifier;
                        var ttype = context.MakeCType(multi.Specifiers, idecl.Declarator, idecl.Initializer, block);
                        block.Typedefs[name] = ttype;
                    }
                    else
                    {
                        CType ctype = context.MakeCType(multi.Specifiers, idecl.Declarator, idecl.Initializer, block);
                        var   name  = idecl.Declarator.DeclaredIdentifier;

                        if (ctype is CFunctionType ftype && !HasStronglyBoundPointer(idecl.Declarator))
                        {
                            var nameContext = (idecl.Declarator.InnerDeclarator is IdentifierDeclarator ndecl && ndecl.Context.Count > 0) ?
                                              string.Join("::", ndecl.Context) : "";
                            var f = new CompiledFunction(name, nameContext, ftype);
                            block.Functions.Add(f);
                        }
                        else
                        {
                            if ((ctype is CArrayType atype) &&
                                (atype.Length == null) &&
                                (idecl.Initializer != null))
                            {
                                if (idecl.Initializer is StructuredInitializer structInit)
                                {
                                    var len = 0;
                                    foreach (var i in structInit.Initializers)
                                    {
                                        if (i.Designation == null)
                                        {
                                            len++;
                                        }
                                        else
                                        {
                                            foreach (var de in i.Designation.Designators)
                                            {
                                                // TODO: Pay attention to designators
                                                len++;
                                            }
                                        }
                                    }
                                    atype = new CArrayType(atype.ElementType, len);
                                }
                                else
                                {
                                    //Report.Error();
                                }
                            }
                            //var init = GetInitExpression(idecl.Initializer);
                            block.AddVariable(name, ctype ?? CBasicType.SignedInt);
                        }

                        if (idecl.Initializer != null)
                        {
                            var varExpr  = new VariableExpression(name, Location.Null, Location.Null);
                            var initExpr = GetInitializerExpression(idecl.Initializer);
                            block.InitStatements.Add(new ExpressionStatement(new AssignExpression(varExpr, initExpr)));
                        }
                    }