efriedma added inline comments.

================
Comment at: clang/test/Sema/warn-vla.c:8-12
+void test2(int n, int v[n]) { // c99 no-warning
+#if __STDC_VERSION__ < 199901L
+// expected-warning@-2{{variable length arrays are a C99 feature}}
+#endif
 }
----------------
aaron.ballman wrote:
> efriedma wrote:
> > aaron.ballman wrote:
> > > efriedma wrote:
> > > > aaron.ballman wrote:
> > > > > efriedma wrote:
> > > > > > aaron.ballman wrote:
> > > > > > > aaron.ballman wrote:
> > > > > > > > inclyc wrote:
> > > > > > > > > aaron.ballman wrote:
> > > > > > > > > > The diagnostic there is rather unfortunate because we're 
> > > > > > > > > > not using a variable-length array in this case.
> > > > > > > > > Emm, I'm not clear about whether we should consider this a 
> > > > > > > > > VLA, and generates `-Wvla-extensions`. Is `v[n]` literally a 
> > > > > > > > > variable-length array? (in source code) So it seems to me 
> > > > > > > > > that we should still report c89 incompatibility warnings?
> > > > > > > > > 
> > > > > > > > C89's grammar only allowed for an integer constant expression 
> > > > > > > > to (optionally) appear as the array extent in an array 
> > > > > > > > declarator, so there is a compatibility warning needed for 
> > > > > > > > that. But I don't think we should issue a warning about this 
> > > > > > > > being a VLA in C99 or later. The array *is* a VLA in terms of 
> > > > > > > > the form written in the source, but C adjusts the parameter to 
> > > > > > > > be a pointer parameter, so as far as the function's type is 
> > > > > > > > concerned, it's not a VLA (it's just a self-documenting 
> > > > > > > > interface).
> > > > > > > > 
> > > > > > > > Because self-documenting code is nice and because people are 
> > > > > > > > worried about accidental use of VLAs that cause stack 
> > > > > > > > allocations (which this does not), I think we don't want to 
> > > > > > > > scare people off from this construct. But I'm curious what 
> > > > > > > > others think as well.
> > > > > > > > But I'm curious what others think as well.
> > > > > > > 
> > > > > > > (Specifically, I'm wondering if others agree that the only 
> > > > > > > warning that should be issued there is a C89 compatibility 
> > > > > > > warning under `-Wvla-extensions` when in C89 mode and via a new 
> > > > > > > `CPre99Compat` diagnostic group when enabled in C99 and later 
> > > > > > > modes.)
> > > > > > > 
> > > > > > > 
> > > > > > I imagine people working with codebases that are also built with 
> > > > > > compilers that don't support VLAs would still want some form of 
> > > > > > warning on any VLA type.
> > > > > The tricky part is: that's precisely what WG14 N2992 
> > > > > (https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2992.pdf) is 
> > > > > clarifying. If your implementation doesn't support VLAs, it's still 
> > > > > required to support this syntactic form. So the question becomes: do 
> > > > > we want a portability warning to compilers that don't conform to the 
> > > > > standard? Maybe we do (if we can find evidence of compilers in such a 
> > > > > state), but probably under a specific diagnostic flag rather than 
> > > > > -Wvla.
> > > > That only applies to C23, though, right?  None of that wording is there 
> > > > for C11.  (In particular, MSVC claims C11 conformance without any 
> > > > support for VLA types.)
> > > In a strict sense, yes, this is a C23 change. There are no changes to 
> > > older standards as far as ISO is concerned (and there never have been).
> > > 
> > > In a practical sense, no, this is clarifying how VLAs have always been 
> > > intended to work. C23 is in a really weird spot in that we had to stop 
> > > our "defect report" process at the end of C17 because the ISO definition 
> > > of a defect did not match the WG14 definition of a defect, and ISO got 
> > > upset. Towards the tail end of the C23 cycle, we introduced a list of 
> > > extensions to obsolete versions of C 
> > > (https://www.open-std.org/jtc1/sc22/wg14/www/previous.html) as a stopgap, 
> > > but the convener would not allow us to retroactively add papers to it. 
> > > The committee still hasn't gotten used to this new process and as a 
> > > result, not many papers have made it to the list. We've also not had the 
> > > chance to discuss 
> > > https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3002.pdf on having a 
> > > more reasonable issue tracking process.
> > > 
> > > The end result is that there's a whole pile of papers in C23 that we 
> > > would have normally treated via the old defect report process but 
> > > couldn't, and if we had treated them via the old DR process, it would 
> > > have been more clear why I think this should be a retroactive change back 
> > > to C99 instead of a C23-only change.
> > Even if the committee can make retroactive changes to standards, that 
> > doesn't change the fact that MSVC doesn't support VLAs, and that codebases 
> > exist which need to be compiled with both clang and MSVC.
> Such code bases are already supported: https://godbolt.org/z/7n768WKW7 but I 
> take your point that not everyone writes portable code when trying to port 
> between compilers, and so some form of diagnostic would be nice. But I don't 
> think that diagnostic is spelled `-Wvla` because the whole point of the paper 
> was to clarify that such a function signature is mandatory to support even if 
> you claim you don't support VLAs and the purpose to `-Wvla` is to identify 
> nonportable code because it's using a VLA.
> 
> Alternatively, when in `-fms-compatibility` mode, we could disallow VLAs and 
> function signatures which involve one because that's not compatible with 
> MSVC. (No idea just how much code that would break or whether I think this 
> idea has much merit or not, just observing that VLAs are a weird boundary 
> case in terms of MS compatibility because they're not a language extension.)
I think there's some value in having flags for both "stack-allocated variable 
length array" and "any type spelled using a VLA".  Which one of those is 
spelled "-Wvla" is up for debate, I guess. I'd be inclined to let the the 
existing warning flag continue to work the way it has for the past; both clang 
and gcc have supported it with the existing semantics for a long time.  It's 
not like there's any shortage of flag names.

When I was referring to "codebases compiled with both clang and MSVC", I wasn't 
specifically referring to codebases that use clang on Windows; I was also 
referring to codebases that use MSVC on Windows, and clang on other targets.  
How -fms-compatibility works is a separate subject.

> the purpose to -Wvla is to identify nonportable code

The standard committee can't magically make something "portable"; portability 
depends on implementations.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D132952

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

Reply via email to