rsmith added inline comments.

> SemaChecking.cpp:11053-11056
> +      if ((RequiredAlignment > AlignRecord) ||
> +          ((Context.toCharUnitsFromBits(
> +                Context.getFieldOffset(cast<FieldDecl>(MD))) %
> +            RequiredAlignment) != 0)) {

This doesn't seem to correctly handle the case where the base expression gives 
you some guaranteed alignment; it only handles the case where the base 
expression reduces the alignment. Suppose `__alignof__(double) == 8` and I have 
this:

  struct __attribute__((packed, aligned(1))) B { double d; };
  struct __attribute__((aligned(8))) A { B b; };
  
  A *p;
  double *q = &p->b.d;

For the top `MemberExpr` here, we see `RequiredAlignment == AlignField == 8`, 
`AlignRecord == 1`,  and we report that we have a reference to a field with 
reduced alignment. But we don't, because the reference is within an 
8-byte-aligned `B` object within the enclosing `A` object.

Do you care about handling that case correctly? It seems like one way to handle 
all the nontrivial cases here would be to recurse to the innermost 
`MemberExpr`, accumulating an offset on the way, and then check that the 
innermost expression's type implies a correct alignment and offset for the type 
of `E`.

> SemaChecking.cpp:11069-11071
> +        // If this field already has the least alignment possible it will 
> never
> +        // yield a misaligned pointer.
> +        break;

Too much indentation.

> SemaChecking.cpp:11072
> +        break;
>      ME = dyn_cast<MemberExpr>(ME->getBase());
>    }

You should at least `IgnoreParens` here, and maybe `IgnoreParenNoopCasts`.

https://reviews.llvm.org/D23657



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

Reply via email to