We shouldn't compare the bounds of two arrays and issue a diagnostic if one of them is dependent.
Details
Diff Detail
- Repository
- rL LLVM
Event Timeline
lib/Sema/SemaDecl.cpp | ||
---|---|---|
3370–3374 ↗ | (On Diff #69927) | Maybe use isDependentSizedArrayType() here instead, so we still diagnose cases where the element type is dependent but the array bound is non-dependent and differs. |
LGTM as-is, but one suggestion if you want to still allow diagnosing a few more cases.
lib/Sema/SemaDecl.cpp | ||
---|---|---|
3377–3378 ↗ | (On Diff #69927) | If you do use isDependentSizedArrayType(), you'll need to change this to check the bounds of the array types rather than the type. |
lib/Sema/SemaDecl.cpp | ||
---|---|---|
3377–3378 ↗ | (On Diff #69927) | It seems to me that you don't want to do the check when either the array bound or the element type is dependent. Which case would we miss if isDependentType is used here instead of isDependentSizedArrayType? Could you show an example? |
lib/Sema/SemaDecl.cpp | ||
---|---|---|
3377–3378 ↗ | (On Diff #69927) | Sure. We could diagnose both declarations in the template here: int a[5]; int b[5]; template<typename T, int N> void f() { extern T a[6]; extern float b[N]; } ... because in both cases the type can never match. However, we don't do this sort of partial type matching in any other cases, so it's very much just a "nice-to-have". |
lib/Sema/SemaDecl.cpp | ||
---|---|---|
3377–3378 ↗ | (On Diff #69927) | Ah, I see your point. If we want to catch those cases too, perhaps we should define and use a function "hasDifferentType" which returns true only if the new and old arrays are known to have different types. In your example, the function would return true for "T a[6]" because we can see it will never match "int a[5]" regardless of what T is. |
I'll commit the patch as-is first and come up with a new patch which implements the improvements you suggested later.