mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 19:40:10 +01:00
Addresses part of issue raised in https://github.com/carbon-language/carbon-lang/issues/7159 by implementing float.add & float.sub builtin for FloatLiteralValues The following code now compiles: ``` let a: f64 = 1.0 + 1.0; ``` Code handles case where operands are both decadic (base 10) and dyadic (base 2) real literals, with the result being whichever format results in smaller mantisssa. File tests assert equality by converting to f128, this can possibly be improved once CompareWith is implemented for FloatLiteral too. Assisted-By: Gemini
83 lines
3.1 KiB
Plaintext
83 lines
3.1 KiB
Plaintext
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/primitives.carbon
|
|
//
|
|
// AUTOUPDATE
|
|
// TIP: To test this file alone, run:
|
|
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/builtins/float/add.carbon
|
|
// TIP: To dump output, run:
|
|
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/builtins/float/add.carbon
|
|
|
|
// --- float_add.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
fn Add(a: f64, b: f64) -> f64 = "float.add";
|
|
|
|
fn RuntimeCallIsValid(a: f64, b: f64) -> f64 {
|
|
//@dump-sem-ir-begin
|
|
return Add(a, b);
|
|
//@dump-sem-ir-end
|
|
}
|
|
|
|
var x: f64 = Add(2.2, 2.3);
|
|
|
|
// --- fail_bad_decl.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_bad_decl.carbon:[[@LINE+4]]:1: error: invalid signature for builtin function "float.add" [InvalidBuiltinSignature]
|
|
// CHECK:STDERR: fn TooFew(a: f64) -> f64 = "float.add";
|
|
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// CHECK:STDERR:
|
|
fn TooFew(a: f64) -> f64 = "float.add";
|
|
// CHECK:STDERR: fail_bad_decl.carbon:[[@LINE+4]]:1: error: invalid signature for builtin function "float.add" [InvalidBuiltinSignature]
|
|
// CHECK:STDERR: fn TooMany(a: f64, b: f64, c: f64) -> f64 = "float.add";
|
|
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// CHECK:STDERR:
|
|
fn TooMany(a: f64, b: f64, c: f64) -> f64 = "float.add";
|
|
// CHECK:STDERR: fail_bad_decl.carbon:[[@LINE+4]]:1: error: invalid signature for builtin function "float.add" [InvalidBuiltinSignature]
|
|
// CHECK:STDERR: fn BadReturnType(a: f64, b: f64) -> bool = "float.add";
|
|
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// CHECK:STDERR:
|
|
fn BadReturnType(a: f64, b: f64) -> bool = "float.add";
|
|
fn JustRight(a: f64, b: f64) -> f64 = "float.add";
|
|
|
|
fn RuntimeCallIsValidTooFew(a: f64) -> f64 {
|
|
return TooFew(a);
|
|
}
|
|
|
|
fn RuntimeCallIsValidTooMany(a: f64, b: f64, c: f64) -> f64 {
|
|
return TooMany(a, b, c);
|
|
}
|
|
|
|
fn RuntimeCallIsValidBadReturnType(a: f64, b: f64) -> bool {
|
|
return BadReturnType(a, b);
|
|
}
|
|
|
|
// CHECK:STDOUT: --- float_add.carbon
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: constants {
|
|
// CHECK:STDOUT: %int_64: Core.IntLiteral = int_value 64 [concrete]
|
|
// CHECK:STDOUT: %f64.dc1: type = class_type @Float, @Float(%int_64) [concrete]
|
|
// CHECK:STDOUT: %Add.type: type = fn_type @Add [concrete]
|
|
// CHECK:STDOUT: %Add: %Add.type = struct_value () [concrete]
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: fn @RuntimeCallIsValid(%a.param: %f64.dc1, %b.param: %f64.dc1) -> out %return.param: %f64.dc1 {
|
|
// CHECK:STDOUT: !entry:
|
|
// CHECK:STDOUT: %Add.ref: %Add.type = name_ref Add, file.%Add.decl [concrete = constants.%Add]
|
|
// CHECK:STDOUT: %a.ref: %f64.dc1 = name_ref a, %a
|
|
// CHECK:STDOUT: %b.ref: %f64.dc1 = name_ref b, %b
|
|
// CHECK:STDOUT: %Add.call: init %f64.dc1 = call %Add.ref(%a.ref, %b.ref)
|
|
// CHECK:STDOUT: return %Add.call
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: fn @__global_init() {
|
|
// CHECK:STDOUT: !entry:
|
|
// CHECK:STDOUT: <elided>
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|