RIscRIpt added inline comments.

================
Comment at: clang/include/clang/Basic/AttrDocs.td:3609-3611
+.. Note:: To use a ``[[msvc::constexpr]]`` function in a constant context,
+   one may want to create a ``constexpr`` function-wrapper and invoke the
+   ``[[msvc::constexpr]]`` function within a ``[[msvc::constexpr]] return`` 
statement.
----------------
RIscRIpt wrote:
> As per latest comments, maybe I should remove this note?
Removed.


================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:2817
+  "[[msvc::constexpr]] has effect only on function definitions and return 
statements">,
+  InGroup<IgnoredAttributes>;
 
----------------
> Given that the intended use case is for usage behind the scenes in the 
> standard library, I don't think we should be changing our diagnostic output 
> at all [there]

How about other places? Theoretically I could re-use existing warnings/errors 
with diagnostics saying `constexpr` instead of `[[msvc::constexpr]]`.


================
Comment at: clang/lib/AST/ExprConstant.cpp:5615-5627
+    if (canEvalMSConstexpr || isMSConstexpr) {
+      // Diagnose invalid usage of [[msvc::constexpr]] function
+      bool isConstructor = isa<CXXConstructorDecl>(Definition);
+      if (canEvalMSConstexpr) { // !isMSConstexpr
+        Info.FFDiag(CallLoc, diag::note_constexpr_invalid_function, 1)
+            << /*IsConstexpr*/ 0 << isConstructor << Definition;
+        Info.Note(Definition->getLocation(), diag::note_declared_at);
----------------
RIscRIpt wrote:
> rsmith wrote:
> > Given that the intended use case is for usage behind the scenes in the 
> > standard library, I don't think we should be changing our diagnostic output 
> > at all here. If the library, as an implementation detail, marks a 
> > non-`constexpr` function as `[[msvc::constexpr]]`, we shouldn't tell the 
> > user to add `[[msvc::constexpr]]` to their code to allow it to be called, 
> > after all, the annotation is an implementation detail of the MS standard 
> > library.
> Sounds fair, I will adjust this code if I'm unable to convince you with my 
> new comments.
Removed, and made the check as a single `if` statement.


================
Comment at: clang/lib/AST/ExprConstant.cpp:9591-9594
+  bool IsMSConstexpr = Info.CurrentCall->CanEvalMSConstexpr &&
+                       OperatorNew->hasAttr<MSConstexprAttr>();
   if (OperatorNew->isReservedGlobalPlacementOperator() &&
+      (Info.CurrentCall->isStdFunction() || IsMSConstexpr) && !E->isArray()) {
----------------
rsmith wrote:
> RIscRIpt wrote:
> > rsmith wrote:
> > > 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.
> > Yes, STL's `operator new` is defined in global namespace in [[ 
> > https://gist.github.com/RIscRIpt/9f0991f09f97eafc375fc73ea851a81b#file-vcruntime_new-h-L165
> >  | vcruntime_new.h ]] (and all includes of this file are made from global 
> > namespace).
> The existing code is checking whether the caller of `operator new` (eg, 
> `std::construct_at`) is in namespace `std`, not whether the `operator new` 
> itself is. Does MSVC's `construct_at` need this? It might if it uses a 
> placement new indirectly via a function in a different namespace, but it 
> seems likely to me that it doesn't.
Yes, sorry, my bad. This change is not needed, unless we want to support this 
attribute in user-code, which I guess we don't want to.

Removed.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D134475/new/

https://reviews.llvm.org/D134475

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to