[PATCH] D128449: [clang] Introduce -Warray-parameter
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 5 05:01:22 PDT 2022
aaron.ballman added inline comments.
================
Comment at: clang/docs/ReleaseNotes.rst:324-326
+- Added the ``-Warray-parameter`` warning. It detects function redefinition,
+ where different definition involve argument type that decay to the same
+ pointer type from different array types.
----------------
================
Comment at: clang/lib/Sema/SemaDecl.cpp:3226-3227
+ if (Old->isVariableArrayType() && New->isVariableArrayType()) {
+ const auto *OldVAT = cast<ArrayType>(Old);
+ const auto *NewVAT = cast<ArrayType>(New);
+ if ((OldVAT->getSizeModifier() == ArrayType::ArraySizeModifier::Star) ^
----------------
Same here.
================
Comment at: clang/lib/Sema/SemaDecl.cpp:3216
+ (Ty->isVariableArrayType() &&
+ cast<VariableArrayType>(Ty)->getSizeModifier() ==
+ ArrayType::ArraySizeModifier::Star);
----------------
aaron.ballman wrote:
> I forgot about this gotcha -- arrays are special in that you shouldn't be using `cast<>` and friends on them, you need to ask the `ASTContext` to go from the `QualType` to the correct array type. e.g., `ASTContext::getAsConstantArrayType()` and `ASTContext::getAsVariableArrayType()` -- I think this is the cause of the failed assertions we're seeing in precommit CI.
I'm still not comfortable with the way this is written -- please go through the `ASTContext` instead, with something like:
```
if (Ty->isIncompleteArrayType() || Ty->isPointerType())
return true;
if (const auto *VAT = Ctx.getAsVariableArrayType(Ty))
return VAT->getSizeModifier() == ArrayType::ArraySizeModifier::Star;
return false;
```
================
Comment at: clang/test/Sema/array-parameter.c:17
+
+void f5(int a[restrict 2]);
+void f5(int a[2]); // no warning
----------------
shafik wrote:
> Since we are covering `static`, `const` and `restict` we should also cover `volatile` for completeness.
+1, might as well round out the set.
================
Comment at: clang/test/Sema/array-parameter.cpp:3-7
+template <int N>
+void func(int i[10]); // expected-note {{previously declared as 'int[10]' here}}
+
+template <int N>
+void func(int i[N]); // expected-warning {{argument 'i' of type 'int[N]' with mismatched bound}}
----------------
One more test, now that I'm thinking about explicit specializations:
```
template <int N>
void func(int (&Val)[N]);
template <>
void func<10>(int (&Val)[10]) {
}
```
I don't think this should get any diagnostics.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D128449/new/
https://reviews.llvm.org/D128449
More information about the cfe-commits
mailing list