RIscRIpt wrote: Initially I replicated semantics of `[[msvc::constexpr]]` from MSVC, so that it was possible to use it the same way as in MSVC, even `[[msvc::constexpr]] return ::new` from non-std namespace. E.g. https://godbolt.org/z/7eKh5Envz ```cpp // 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()); ``` However @rsmith raised a concern over changes in `PointerExprEvaluator::VisitCXXNewExpr`: ```diff bool IsNothrow = false; bool IsPlacement = false; + bool IsMSConstexpr = Info.CurrentCall->CanEvalMSConstexpr && + OperatorNew->hasAttr<MSConstexprAttr>(); if (OperatorNew->isReservedGlobalPlacementOperator() && - Info.CurrentCall->isStdFunction() && !E->isArray()) { + (Info.CurrentCall->isStdFunction() || IsMSConstexpr) && !E->isArray()) { ``` > Do we really need this change? Was our existing check of whether the caller > is in namespace std not sufficient for MS' standard library? I'd strongly > prefer not to have a documented, user-visible attribute that gives permission > to use placement new directly. If I could choose, I would opt to fully replicate the behavior of MSVC. However, I also acknowledge the concerns that have been raised. @AaronBallman, @erichkeane, any comments? https://github.com/llvm/llvm-project/pull/71300 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits