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); }
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(); }
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); }
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); }