tbaeder created this revision. tbaeder added reviewers: aaron.ballman, erichkeane, shafik, cor3ntin. Herald added a project: All. tbaeder requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D155707 Files: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/ByteCodeExprGen.h clang/test/AST/Interp/literals.cpp Index: clang/test/AST/Interp/literals.cpp =================================================================== --- clang/test/AST/Interp/literals.cpp +++ clang/test/AST/Interp/literals.cpp @@ -1033,3 +1033,14 @@ int array[(long)(char*)0]; // ref-warning {{variable length array folded to constant array}} \ // expected-warning {{variable length array folded to constant array}} } + +namespace NE { + constexpr int foo() noexcept { + return 1; + } + static_assert(noexcept(foo()), ""); + constexpr int foo2() { + return 1; + } + static_assert(!noexcept(foo2()), ""); +} Index: clang/lib/AST/Interp/ByteCodeExprGen.h =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.h +++ clang/lib/AST/Interp/ByteCodeExprGen.h @@ -101,6 +101,7 @@ bool VisitCXXThrowExpr(const CXXThrowExpr *E); bool VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *E); bool VisitSourceLocExpr(const SourceLocExpr *E); + bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E); protected: bool visitExpr(const Expr *E) override; Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1191,6 +1191,16 @@ return true; } +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) { + assert(E->getType()->isBooleanType()); + const Expr *Operand = E->getOperand(); + + if (DiscardResult) + return this->discard(Operand); + return this->emitConstBool(E->getValue(), E); +} + template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) { if (E->containsErrors()) return false;
Index: clang/test/AST/Interp/literals.cpp =================================================================== --- clang/test/AST/Interp/literals.cpp +++ clang/test/AST/Interp/literals.cpp @@ -1033,3 +1033,14 @@ int array[(long)(char*)0]; // ref-warning {{variable length array folded to constant array}} \ // expected-warning {{variable length array folded to constant array}} } + +namespace NE { + constexpr int foo() noexcept { + return 1; + } + static_assert(noexcept(foo()), ""); + constexpr int foo2() { + return 1; + } + static_assert(!noexcept(foo2()), ""); +} Index: clang/lib/AST/Interp/ByteCodeExprGen.h =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.h +++ clang/lib/AST/Interp/ByteCodeExprGen.h @@ -101,6 +101,7 @@ bool VisitCXXThrowExpr(const CXXThrowExpr *E); bool VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *E); bool VisitSourceLocExpr(const SourceLocExpr *E); + bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E); protected: bool visitExpr(const Expr *E) override; Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1191,6 +1191,16 @@ return true; } +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) { + assert(E->getType()->isBooleanType()); + const Expr *Operand = E->getOperand(); + + if (DiscardResult) + return this->discard(Operand); + return this->emitConstBool(E->getValue(), E); +} + template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) { if (E->containsErrors()) return false;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits