llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Oleksandr T. (a-tarasyuk) <details> <summary>Changes</summary> Fixes #<!-- -->74924 --- Full diff: https://github.com/llvm/llvm-project/pull/119153.diff 3 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+2) - (modified) clang/lib/AST/ExprConstant.cpp (+3-1) - (added) clang/test/AST/ms-constexpr-new.cpp (+13) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3f58e64cf0ccbc..71666e26146e92 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -525,6 +525,8 @@ Attribute Changes in Clang - The ``target_version`` attribute is now only supported for AArch64 and RISC-V architectures. +- Clang now permits ``[[msvc::constexpr]]`` usage outside of the std namespace. (#GH74924) + Improvements to Clang's diagnostics ----------------------------------- diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 6b5b95aee35522..9dbb350be59091 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -10172,7 +10172,9 @@ bool PointerExprEvaluator::VisitCXXNewExpr(const CXXNewExpr *E) { return false; IsNothrow = true; } else if (OperatorNew->isReservedGlobalPlacementOperator()) { - if (Info.CurrentCall->isStdFunction() || Info.getLangOpts().CPlusPlus26) { + if (Info.CurrentCall->isStdFunction() || Info.getLangOpts().CPlusPlus26 || + (Info.CurrentCall->CanEvalMSConstexpr && + OperatorNew->hasAttr<MSConstexprAttr>())) { if (!EvaluatePointer(E->getPlacementArg(0), Result, Info)) return false; if (Result.Designator.Invalid) diff --git a/clang/test/AST/ms-constexpr-new.cpp b/clang/test/AST/ms-constexpr-new.cpp new file mode 100644 index 00000000000000..4b534cf0207644 --- /dev/null +++ b/clang/test/AST/ms-constexpr-new.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -fms-compatibility -fms-compatibility-version=19.33 -std=c++20 -ast-dump %s | FileCheck %s + +// CHECK: used operator new +// CHECK: MSConstexprAttr 0x{{[0-9a-f]+}} <col:17, col:23> +[[nodiscard]] [[msvc::constexpr]] inline void* __cdecl operator new(decltype(sizeof(void*)), void* p) noexcept { return p; } + +// CHECK: used constexpr construct_at +// CHECK: AttributedStmt 0x{{[0-9a-f]+}} <col:46, col:88> +// CHECK-NEXT: MSConstexprAttr 0x{{[0-9a-f]+}} <col:48, col:54> +// CHECK-NEXT: ReturnStmt 0x{{[0-9a-f]+}} <col:66, col:88> +constexpr int* construct_at(int* p, int v) { [[msvc::constexpr]] return ::new (p) int(v); } +constexpr bool check_construct_at() { int x; return *construct_at(&x, 42) == 42; } +static_assert(check_construct_at()); `````````` </details> https://github.com/llvm/llvm-project/pull/119153 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits