On Sun, 20 Sep 2020 at 08:43, Dávid Bolvanský via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

> Author: Dávid Bolvanský
> Date: 2020-09-20T17:43:06+02:00
> New Revision: 2ae182258c49724e4daaae196de829ea65c116e8
>
> URL:
> https://github.com/llvm/llvm-project/commit/2ae182258c49724e4daaae196de829ea65c116e8
> DIFF:
> https://github.com/llvm/llvm-project/commit/2ae182258c49724e4daaae196de829ea65c116e8.diff
>
> LOG: [Diagnostics] Fixed -Wsizeof-array-div false positive when divisor is
> sizeof reference type (PR47495)
>
> Added:
>
>
> Modified:
>     clang/lib/Sema/SemaExpr.cpp
>     clang/test/Sema/div-sizeof-array.cpp
>
> Removed:
>
>
>
>
> ################################################################################
> diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
> index 501e1aed1509..736a6c166eb3 100644
> --- a/clang/lib/Sema/SemaExpr.cpp
> +++ b/clang/lib/Sema/SemaExpr.cpp
> @@ -10038,7 +10038,7 @@ static void
> DiagnoseDivisionSizeofPointerOrArray(Sema &S, Expr *LHS, Expr *RHS,
>      QualType ArrayElemTy = ArrayTy->getElementType();
>      if (ArrayElemTy != S.Context.getBaseElementType(ArrayTy) ||
>          ArrayElemTy->isDependentType() || RHSTy->isDependentType() ||
> -        ArrayElemTy->isCharType() ||
> +        RHSTy->isReferenceType() || ArrayElemTy->isCharType() ||
>

Instead of skipping the check for a reference type, could we instead
replace RHSTy with its referenced type for the purpose of the check when
RHSTy is a reference type? I think we do want to diagnose (for example)
sizeof(array) / sizeof(decltype(*array[0])) for an array of pointers.


>          S.Context.getTypeSize(ArrayElemTy) ==
> S.Context.getTypeSize(RHSTy))
>        return;
>      S.Diag(Loc, diag::warn_division_sizeof_array)
>
> diff  --git a/clang/test/Sema/div-sizeof-array.cpp
> b/clang/test/Sema/div-sizeof-array.cpp
> index e295a9dec6d8..898ff42a7bd4 100644
> --- a/clang/test/Sema/div-sizeof-array.cpp
> +++ b/clang/test/Sema/div-sizeof-array.cpp
> @@ -42,4 +42,8 @@ void test(void) {
>
>    float m[4][4];
>    int d1 = sizeof(m) / sizeof(**m);
> +
> +  int array[10];
> +  int narray = sizeof(array) / sizeof(int &);
> +  int narray2 = sizeof(array) / sizeof(decltype(array[0]));
>  }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to