diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-12-17 20:41:09 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2023-12-17 20:41:09 +0000 |
| commit | 312c0ed19cc5276a17bacf2120097bec4515b0f1 (patch) | |
| tree | e6e4a4163840b73ba54bb0d3b70ee4899e4b7434 /clang/lib/AST/Interp/EvalEmitter.cpp | |
| parent | b1c73532ee8997fe5dfbeb7d223027bdf99758a0 (diff) | |
Diffstat (limited to 'clang/lib/AST/Interp/EvalEmitter.cpp')
| -rw-r--r-- | clang/lib/AST/Interp/EvalEmitter.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/clang/lib/AST/Interp/EvalEmitter.cpp b/clang/lib/AST/Interp/EvalEmitter.cpp index 9bc42057c5f5..0ff0bde8fd17 100644 --- a/clang/lib/AST/Interp/EvalEmitter.cpp +++ b/clang/lib/AST/Interp/EvalEmitter.cpp @@ -208,6 +208,27 @@ bool EvalEmitter::emitRetValue(const SourceInfo &Info) { } return Ok; } + + // Complex types. + if (const auto *CT = Ty->getAs<ComplexType>()) { + QualType ElemTy = CT->getElementType(); + std::optional<PrimType> ElemT = Ctx.classify(ElemTy); + assert(ElemT); + + if (ElemTy->isIntegerType()) { + INT_TYPE_SWITCH(*ElemT, { + auto V1 = Ptr.atIndex(0).deref<T>(); + auto V2 = Ptr.atIndex(1).deref<T>(); + Result = APValue(V1.toAPSInt(), V2.toAPSInt()); + return true; + }); + } else if (ElemTy->isFloatingType()) { + Result = APValue(Ptr.atIndex(0).deref<Floating>().getAPFloat(), + Ptr.atIndex(1).deref<Floating>().getAPFloat()); + return true; + } + return false; + } llvm_unreachable("invalid value to return"); }; |
