<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Apr 26, 2020 at 10:23 AM James Y Knight <<a href="mailto:jyknight@google.com">jyknight@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div>Unfortunately, this is invalid behavior. _Alignof/alignof must return the <i>required</i> alignment for a type. Given that per your previous example:</div><div><font face="monospace">struct C {</font></div><div><font face="monospace">  int n;</font></div><div><font face="monospace">  struct A a;</font></div><div><font face="monospace">};</font></div><div>would place the type A at an offset of 4, alignof(A) cannot correctly return greater than 4.</div></div></div></blockquote><div>I am inclined to agree. There are practical effects on the return value of such queries for user programs such as problems with <span style="font-family:monospace">PointerIntPair</span>-like mechanisms and the minimally-guaranteed alignment barring contortions is the safe value. I'm not sure if we will eventually need a further extension (under option control) to make the return value match the reference implementations.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>You also need to ensure that the alignment values that Clang specifies when creating memory operations in LLVM IR are correct, and not higher than they should be, which they will be, if you've set the alignment of the structure too high.</div></div></div></blockquote><div>If a user wishes to operate on an under-aligned object with Clang, what is the recommendation? I am asking mainly in terms of the user source.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>I believe the best option would be to modify the struct layout code to round up the size as Eli suggests, and then modify ASTContext::getPreferredTypeAlign so that variables of these types get an increased alignment. This function is also used to implement the non-standard GCC extension "__alignof__(T)", which unlike alignof/_Alignof, returns the "preferred" alignment of T, rather than the minimum alignment.</div></div></div></blockquote><div>Thanks. I think we can explore that.<br></div><br></div></div>