Author: Timm Bäder Date: 2022-09-08T07:31:07+02:00 New Revision: 4d700ffe67be03220487604785ee2049570ba6db
URL: https://github.com/llvm/llvm-project/commit/4d700ffe67be03220487604785ee2049570ba6db DIFF: https://github.com/llvm/llvm-project/commit/4d700ffe67be03220487604785ee2049570ba6db.diff LOG: [clang][Interp] Implement ImplicitValueInitExprs Take the existing Zero opcode and emit it. Differential Revision: https://reviews.llvm.org/D132829 Added: clang/test/AST/Interp/arrays.cpp Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/ByteCodeExprGen.h clang/lib/AST/Interp/Opcodes.td Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index d2efad4e082c..a6fea951f759 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -223,6 +223,14 @@ bool ByteCodeExprGen<Emitter>::VisitBinaryOperator(const BinaryOperator *BO) { return this->bail(BO); } +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { + if (Optional<PrimType> T = classify(E)) + return this->emitZero(*T, E); + + return false; +} + template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) { OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/true); diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.h b/clang/lib/AST/Interp/ByteCodeExprGen.h index f603f436f3c7..6793cdffecee 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.h +++ b/clang/lib/AST/Interp/ByteCodeExprGen.h @@ -75,6 +75,7 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>, bool VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E); bool VisitUnaryOperator(const UnaryOperator *E); bool VisitDeclRefExpr(const DeclRefExpr *E); + bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E); protected: bool visitExpr(const Expr *E) override; diff --git a/clang/lib/AST/Interp/Opcodes.td b/clang/lib/AST/Interp/Opcodes.td index dcb995266c2c..49cc0e0253de 100644 --- a/clang/lib/AST/Interp/Opcodes.td +++ b/clang/lib/AST/Interp/Opcodes.td @@ -203,6 +203,7 @@ def ConstBool : ConstOpcode<Bool, ArgBool>; // [] -> [Integer] def Zero : Opcode { let Types = [AluTypeClass]; + let HasGroup = 1; } // [] -> [Pointer] diff --git a/clang/test/AST/Interp/arrays.cpp b/clang/test/AST/Interp/arrays.cpp new file mode 100644 index 000000000000..74fd1f0fbb3f --- /dev/null +++ b/clang/test/AST/Interp/arrays.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -verify %s +// RUN: %clang_cc1 -verify=ref %s + + +/// expected-no-diagnostics +/// ref-no-diagnostics + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wc99-extensions" +#pragma clang diagnostic ignored "-Winitializer-overrides" +/// FIXME: The example below tests ImplicitValueInitExprs, but we can't +/// currently evaluate other parts of it. +#if 0 +struct fred { + char s [6]; + int n; +}; + +struct fred y [] = { [0] = { .s[0] = 'q' } }; +#endif +#pragma clang diagnostic pop _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits