================
@@ -1163,6 +1181,19 @@ bool createParameters(NewFunction &ExtractedFunc,
// Parameter qualifiers are same as the Decl's qualifiers.
QualType FullTypeInfo = VD->getType();
QualType TypeInfo = FullTypeInfo.getNonReferenceType();
+
+ // A variably-modified type that isn't itself a plain array (e.g. a
+ // pointer to a VLA, `int (*)[N]`) has no path below that handles it
+ // safely: its bound is baked into the type at every level, so it
+ // keeps mentioning `N` whether passed by value, by reference, or
+ // (in C) by pointer -- const-qualifying or wrapping it in another
+ // pointer/reference doesn't remove the bound from the type the way
+ // decaying an array's own outer dimension does. A plain array gets
+ // a narrower, more precise check further down instead, since its
+ // outer dimension specifically isn't a problem once decayed.
+ if (TypeInfo->isVariablyModifiedType() && !TypeInfo->isArrayType())
----------------
ArcsinX wrote:
Here we reject variable modified type if it's not array, but lower (where my
previous comment was) we reject for array types too in case of C++. So, maybe
we can combine these checks here:
```cpp
if (TypeInfo->isVariablyModifiedType() &&
(LangOpts.CPlusPlus || !TypeInfo->isArrayType()))
return false;
```
And remove the check there (where my prev comment was)
https://github.com/llvm/llvm-project/pull/230046
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits