[Clang][Sema] Warn when function argument is less aligned than parameter

Authored by tmatheson on Feb 19 2021, 9:33 AM.


[Clang][Sema] Warn when function argument is less aligned than parameter

See https://bugs.llvm.org/show_bug.cgi?id=42154.

GCC's attribute((align)) can reduce the alignment of a type when applied to
a typedef. However, functions which take a pointer or reference to the
original type are compiled assuming the original alignment. Therefore when any
such function is passed an object of the new, less-aligned type, an alignment
fault can occur. In particular, this applies to the constructor, which is
defined for the original type and called for the less-aligned object.

This change adds a warning whenever an pointer or reference to an object is
passed to a function that was defined for a more-aligned type.

The calls to ASTContext::getTypeAlignInChars seem change the order in which
record layouts are evaluated, which caused changes to the output of
-fdump-record-layouts. As such some tests needed to be updated:

  • Use CHECK-LABEL rather than counting the number of "Dumping AST Record Layout" headers.
  • Check for end of line in labels, so that struct B1 doesn't match struct B etc.
  • Add --strict-whitespace, since the whitespace shows meaningful structure.
  • The order in which record layouts are printed has changed in some cases.
  • clang-format for regions changed

Differential Revision: https://reviews.llvm.org/D97187