Author: Timm Bäder Date: 2024-06-12T08:15:36+02:00 New Revision: 93d4fb032ec1e069cfa5b800f3ca1c807f0d87ac
URL: https://github.com/llvm/llvm-project/commit/93d4fb032ec1e069cfa5b800f3ca1c807f0d87ac DIFF: https://github.com/llvm/llvm-project/commit/93d4fb032ec1e069cfa5b800f3ca1c807f0d87ac.diff LOG: [clang][Interp] Support floats in APValues Added: Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/test/AST/Interp/records.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index 820e4cc44a7bc..1393ef1f2ec35 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -3223,6 +3223,8 @@ bool ByteCodeExprGen<Emitter>::visitAPValue(const APValue &Val, assert(!DiscardResult); if (Val.isInt()) return this->emitConst(Val.getInt(), ValType, E); + else if (Val.isFloat()) + return this->emitConstFloat(Val.getFloat(), E); if (Val.isLValue()) { if (Val.isNullPointer()) @@ -3253,7 +3255,7 @@ bool ByteCodeExprGen<Emitter>::visitAPValueInitializer(const APValue &Val, const APValue &F = Val.getStructField(I); const Record::Field *RF = R->getField(I); - if (F.isInt() || F.isLValue() || F.isMemberPointer()) { + if (F.isInt() || F.isFloat() || F.isLValue() || F.isMemberPointer()) { PrimType T = classifyPrim(RF->Decl->getType()); if (!this->visitAPValue(F, T, E)) return false; diff --git a/clang/test/AST/Interp/records.cpp b/clang/test/AST/Interp/records.cpp index 0a89c81bafd57..8a18f7a2a4890 100644 --- a/clang/test/AST/Interp/records.cpp +++ b/clang/test/AST/Interp/records.cpp @@ -1479,4 +1479,17 @@ namespace VirtOperator { }; constexpr bool cmp_base_derived = D() == D(); // both-warning {{ambiguous}} } + +namespace FloatAPValue { + struct ClassTemplateArg { + int a; + float f; + }; + template<ClassTemplateArg A> struct ClassTemplateArgTemplate { + static constexpr const ClassTemplateArg &Arg = A; + }; + ClassTemplateArgTemplate<ClassTemplateArg{1, 2.0f}> ClassTemplateArgObj; + template<const ClassTemplateArg&> struct ClassTemplateArgRefTemplate {}; + ClassTemplateArgRefTemplate<ClassTemplateArgObj.Arg> ClassTemplateArgRefObj; +} #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits