예제 #1
0
        public override bool VisitFunctionDecl(AST.Function function)
        {
            if (!VisitDeclaration(function))
            {
                return(false);
            }

            if (function.IsAmbiguous)
            {
                return(false);
            }

            var overloads = function.Namespace.GetOverloads(function);

            foreach (var overload in overloads)
            {
                if (function.OperatorKind == CXXOperatorKind.Conversion)
                {
                    continue;
                }
                if (function.OperatorKind == CXXOperatorKind.ExplicitConversion)
                {
                    continue;
                }

                if (overload == function)
                {
                    continue;
                }

                if (!overload.IsGenerated)
                {
                    continue;
                }

                if (!CheckConstness(function, overload))
                {
                    continue;
                }

                if (!CheckDefaultParameters(function, overload))
                {
                    continue;
                }

                function.IsAmbiguous = true;
                overload.IsAmbiguous = true;
            }

            if (function.IsAmbiguous)
            {
                Driver.Diagnostics.Debug("Found ambiguous overload: {0}",
                                         function.QualifiedOriginalName);
            }

            return(true);
        }
예제 #2
0
        public void Visit(AST.Function func)
        {
            if (func.BuiltIn)
            {
                values.Push(builtIns.Find(func)); return;
            }

            hierarchy.Push(func);

            if (llvmFuncs.TryGetValue(func, out var funcLLVM))
            {
                values.Push(funcLLVM);
            }
            else
            {
                var name       = DetermineName();
                var retType    = func.RetType != null ? ((AST.TypeObj)func.RetType).ToLLVM() : LLVM.VoidType();
                var paramTypes = GetTypes(func.Parameters);
                llvmFuncs[func] = funcLLVM = LLVM.AddFunction(moduleLLVM, name, LLVM.FunctionType(retType, paramTypes, false));
                LLVM.SetLinkage(funcLLVM, LLVMLinkage.LLVMExternalLinkage);

                for (var i = 0; i < func.Parameters.Count; i += 1)
                {
                    var param = LLVM.GetParam(funcLLVM, (uint)i);
                    llvmParams[func.Parameters[i]] = param;
                    LLVM.SetValueName(param, func.Parameters[i].Name);
                }

                var varBlock  = LLVM.AppendBasicBlock(funcLLVM, "var");
                var codeBlock = LLVM.AppendBasicBlock(funcLLVM, "begin");
                varBlocks.Push(varBlock);
                codeBlocks.Push(codeBlock);

                foreach (var statement in func.Statements)
                {
                    statement.Accept(this);
                    if (returns)
                    {
                        break;
                    }
                }
                if (returns == false && func.RetType == null)
                {
                    LLVM.PositionBuilderAtEnd(builder, codeBlocks.Peek());
                    LLVM.BuildRetVoid(builder);
                }
                LLVM.PositionBuilderAtEnd(builder, varBlock);
                LLVM.BuildBr(builder, codeBlock);
                codeBlocks.Pop();
                varBlocks.Pop();

                values.Push(funcLLVM);
            }

            hierarchy.Pop();
        }
예제 #3
0
        public override bool VisitFunctionDecl(AST.Function function)
        {
            if (!VisitDeclaration(function))
            {
                return(false);
            }

            if (function.IsAmbiguous || !function.IsGenerated)
            {
                return(false);
            }

            var overloads = function.Namespace.GetOverloads(function);

            foreach (var overload in overloads)
            {
                if (overload == function)
                {
                    continue;
                }

                if (!overload.IsGenerated)
                {
                    continue;
                }

                var ambiguous =
                    function.OperatorKind == CXXOperatorKind.Conversion ||
                    function.OperatorKind == CXXOperatorKind.ExplicitConversion
                    ? CheckConversionAmbiguity(function, overload)
                    : CheckConstnessForAmbiguity(function, overload) ||
                    CheckDefaultParametersForAmbiguity(function, overload) ||
                    CheckParametersPointerConstnessForAmbiguity(function, overload);

                if (ambiguous)
                {
                    function.IsAmbiguous = true;
                    overload.IsAmbiguous = true;
                }
            }

            if (function.IsAmbiguous)
            {
                Diagnostics.Message($"Found ambiguous overload: {function.QualifiedOriginalName}");
            }

            return(true);
        }
예제 #4
0
        public override bool VisitFunctionDecl(AST.Function function)
        {
            if (AlreadyVisited(function))
            {
                return(false);
            }

            if (function.IsAmbiguous)
            {
                return(false);
            }

            var overloads = function.Namespace.GetFunctionOverloads(function);

            foreach (var overload in overloads)
            {
                if (overload == function)
                {
                    continue;
                }

                if (overload.Ignore)
                {
                    continue;
                }

                if (!CheckDefaultParameters(function, overload))
                {
                    continue;
                }

                if (!CheckConstness(function, overload))
                {
                    continue;
                }

                function.IsAmbiguous = true;
                overload.IsAmbiguous = true;
            }

            if (function.IsAmbiguous)
            {
                Driver.Diagnostics.EmitWarning("Found ambiguous overload: {0}",
                                               function.QualifiedOriginalName);
            }

            return(true);
        }