Quuxplusone added inline comments.

================
Comment at: clang/lib/Frontend/InitPreprocessor.cpp:593-594
+  // C++2b features.
+  if (LangOpts.CPlusPlus2b)
+    Builder.defineMacro("__cpp_size_t_suffix", "202011L");
   if (LangOpts.Char8)
----------------
AntonBikineev wrote:
> AntonBikineev wrote:
> > Quuxplusone wrote:
> > > aaron.ballman wrote:
> > > > AntonBikineev wrote:
> > > > > aaron.ballman wrote:
> > > > > > Because we allow this as an extension in all C++ modes, should this 
> > > > > > be enabled always rather than gated on C++2b?
> > > > > I was also wondering about this. I've checked that we also do the 
> > > > > same for other feature macros, such as __cpp_binary_literals, which 
> > > > > is defined for -std>=c++14 while at the same time is allowed as an 
> > > > > extension before C++14. Therefore I decided to mimic the behaviour.
> > > > Thanks for checking on that! I think that seems defensible enough. :-)
> > > Btw, thus far libc++ has tended to make the opposite choice: for example, 
> > > libc++ defines `__cpp_lib_variant == 202102` in all modes, because the 
> > > programmer conceivably might be depending on that macro to make some 
> > > decision, so we want to make sure it reflects the specific semantics that 
> > > we implement.  (For `__cpp_binary_literals` specifically, I agree it 
> > > doesn't really matter because nobody's going to be making decisions based 
> > > on the value of this macro.)
> > > 
> > > See https://reviews.llvm.org/D99290#inline-934563 (D96385, D97394) for 
> > > previous discussions on the libc++ side.
> > Thanks for pointing this out, Arthur.
> > 
> > I wish there was some consistency, however, I'm not sure if this is easily 
> > feasible. I guess the strategy of defining `__cpp_size_t_literals` on all 
> > modes would be problematic, since if the user code depends on 
> > `__cpp_size_t_literals`, it could suddenly receive the extension warning 
> > (when compiled with -std<2++2b), which is enabled by default.
> > Btw, thus far libc++ has tended to make the opposite choice: for example, 
> > libc++ defines `__cpp_lib_variant == 202102` in all modes, because the 
> > programmer conceivably might be depending on that macro to make some 
> > decision, so we want to make sure it reflects the specific semantics that 
> > we implement.  (For `__cpp_binary_literals` specifically, I agree it 
> > doesn't really matter because nobody's going to be making decisions based 
> > on the value of this macro.)
> > 
> > See https://reviews.llvm.org/D99290#inline-934563 (D96385, D97394) for 
> > previous discussions on the libc++ side.
> 
> 
> I guess the strategy of defining `__cpp_size_t_literals` in all modes would 
> be problematic, since if the [pre-C++2b] user code depends on 
> `__cpp_size_t_literals`, it could suddenly receive the extension warning...

Ah, yes. Orthogonally to everything I said above, I think it's fair to say that
- in modes where `42uz` produces a fatal error, it's definitely "not supported"
- in modes where it's accepted without complaint, it's definitely "supported" 
(*)
- in modes where it produces a non-fatal warning, you can plausibly argue it 
either way
(*) - with a bonus exception that if the user passes `-Wno-blah` or `-w`, that 
doesn't magically make things be supported
libc++'s situation seems more black-and-white; e.g. `variant` behaves one way 
or the other. There's no libc++ equivalent of "you get the new behavior but 
with a warning." :)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D99456

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

Reply via email to