Origami404 added a subscriber: mizvekov.
Origami404 added a comment.

Hello, I am back now and will be available anytime next week, so if anyone has 
any idea on this topic, please at me!

I haven't found a way that "feels right" to achieve consensus yet. But I do 
have something to share currently.

---

For the semantics of the warning flag, I agree with @uecker that 
`-Wvla-portability` should be changed to `-Wc++-compat`. In my reading of C2x 
standard, using VM type is acceptable and the only reason we need to issue a 
warning is that the C++ standard doesn't allow non-constant array length at 
all. But I have no opinion on the semantics of `-Wvla` and `-Wvla-stack-alloc`.

And should `-Wvla-stack-alloc` fires on static VLAs? (like 
`clang/test/drs/dr3xx.c:164`)

---

For implement details, I add a diag at ``, which will be called after a 
variable declaration. Here we can get the full type of the variable to tell 
whether the variable has a VLA type or just a VM type.

In the GitHub issue 
<https://github.com/llvm/llvm-project/issues/57098#issuecomment-1265130710>, 
@mizvekov said:

> A general check about any VLA usage at all should probably happen early when 
> we finished parsing and are building VariableArray types, probably in 
> `Sema::BuildArrayType`.
>
> Otherwise sprinkling around checks for VM types seems messy, so I don't think 
> considering VM for this problem is an efficient approach.

But AFAIK, a VLA type cannot be told just at `Sema::BuildArrayType` level 
because the constructing VLA type may just be a part of another VM type but not 
a VLA type for a VLA. At `Sema::BuildArrayType`, we seem only can detect VM 
type instead of VLA type.

---

In Ballman's summary, the `-Wvla-stack-alloc` should suppress the 
`-Wvla-portability`:

> -Wvla-portability warns on any use of a VM type, except if 
> -Wvla-stack-allocation is also enabled it won't warn on the use of VLA that 
> involves a stack allocation

I failed to achieve the "except" here because, in the current implementation, 
VM type-related warnings are checked directly at `Sema::BuildArrayType`, by 
`checkArraySize` which used `Sema::VerifyIntegerConstantExpression`. But the 
`Sema::VerifyIntegerConstantExpression` requires at least one diag at each 
non-ICE occurrence. I haven't found a way to avoid the diag yet.

---

By the way, I seem to find a bug in the current implementation of VM type 
warning. For VLA at sizeof context, the warning will be issued twice. Github 
issue here <https://github.com/llvm/llvm-project/issues/59570>. It cause the 
test `clang/test/Sema/warn-vla.c:48` giving two warnings.

---

The reason why I set both `-Wvla-stack-alloc` and `-Wvla-portability` to 
`DefaultIgnore` is that:

- if both of them are not `DefaultIgnore`, 200 tests will fail
- if only `-Wvla-stack-alloc` is not `DefaultIgnore`, 169 tests will fail
- if both of them are `DefaultIgnore`, only 4 tests will fail

Most of the failed tests seem cannot be avoided because they just use VLAs. If 
`DefaultIgnore` is strongly unrecommended, I can go through all the tests and 
add an expected warning diag for them. It's a bit time-consuming, but I am free 
all day now.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D137343

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

Reply via email to