| 89 | } |
| 90 | |
| 91 | void ReplaceFloatModulo( ParserState& state ) |
| 92 | { |
| 93 | ZoneScoped; |
| 94 | |
| 95 | state.GetTree()->Map( [&]( auto node ) { |
| 96 | if( node->GetNodeType() == NT_EXPRESSION && node->GetToken()->type == OP_PERCENT ) |
| 97 | { |
| 98 | if( node->GetChild( 1 )->GetType().IsScalarOrVector() && node->GetChild( 1 )->GetType().builtInType == OP_FLOAT ) |
| 99 | { |
| 100 | auto token = ScannerToken::ID( MakeInlineString( "fmod" ), node->GetLocation() ); |
| 101 | auto call = new ASTNode( NT_FUNCTION_CALL, node->GetLocation(), node->GetScope(), &token ); |
| 102 | call->AddChild( node->GetChild( 0 ) ); |
| 103 | call->AddChild( node->GetChild( 1 ) ); |
| 104 | std::string diagnosticMessage; |
| 105 | Symbol* symbol = state.GetSymbolTable().LookupFunction( token.stringValue, call, diagnosticMessage ); |
| 106 | if( symbol ) |
| 107 | { |
| 108 | if( symbol->intrinsicType ) |
| 109 | { |
| 110 | call->SetType( ( *symbol->intrinsicType )( call, -1 ) ); |
| 111 | } |
| 112 | else |
| 113 | { |
| 114 | call->SetType( symbol->type ); |
| 115 | } |
| 116 | call->SetSymbol( symbol ); |
| 117 | return call; |
| 118 | } |
| 119 | } |
| 120 | } |
| 121 | return node; |
| 122 | } ); |
| 123 | } |
| 124 | |
| 125 | |
| 126 | void ConvertSyncFunctionsToMetal( ASTNode* node ) |
no test coverage detected