Quellcode durchsuchen

Support floats in MapAPValueToConstant (#6800)

This allows `constexpr float` to be properly imported as a constant.
Nicholas Bishop vor 2 Monaten
Ursprung
Commit
96f163f114

+ 4 - 0
toolchain/check/cpp/constant.cpp

@@ -30,6 +30,10 @@ auto MapAPValueToConstant(Context& context, SemIR::LocId loc_id,
       return TryEvalInst(context,
       return TryEvalInst(context,
                          SemIR::IntValue{.type_id = type_id, .int_id = int_id});
                          SemIR::IntValue{.type_id = type_id, .int_id = int_id});
     }
     }
+  } else if (ap_value.isFloat()) {
+    FloatId float_id = context.floats().Add(ap_value.getFloat());
+    return TryEvalInst(
+        context, SemIR::FloatValue{.type_id = type_id, .float_id = float_id});
   } else {
   } else {
     // TODO: support other types.
     // TODO: support other types.
     return SemIR::ConstantId::NotConstant;
     return SemIR::ConstantId::NotConstant;

+ 12 - 0
toolchain/check/testdata/interop/cpp/constexpr.carbon

@@ -33,3 +33,15 @@ constexpr int i = 123;
 class C(I:! i32) {}
 class C(I:! i32) {}
 fn F() -> C(Cpp.i);
 fn F() -> C(Cpp.i);
 let x: C(123) = F();
 let x: C(123) = F();
+
+// --- float.carbon
+
+library "[[@TEST_NAME]]";
+
+import Cpp inline '''
+constexpr float flt = 123.5;
+''';
+
+class C(V:! f32) {}
+fn F() -> C(Cpp.flt);
+let x: C(123.5) = F();