Xiangling_L marked 9 inline comments as done.
Xiangling_L added inline comments.


================
Comment at: clang/include/clang/Sema/Sema.h:488
+    AlignPackInfo(AlignPackInfo::Mode M, int Num, bool IsAIX)
+        : PackAttr(true), AlignMode(M), PackNumber(Num), AIXStack(IsAIX) {}
+
----------------
jasonliu wrote:
> I noticed PackNumber is an unsigned char and we are passing an int type into 
> it.
> Could we add an assertion in the constructor to make sure Num would never be 
> something that's going to get truncated when it converts to an unsigned char?
I think the warning/error `expected #pragma pack parameter to be '1', '2', '4', 
'8', or '16'` have already guaranteed that for us? Or maybe using `unsigned 
int` makes people more comfortable?


================
Comment at: clang/include/clang/Sema/Sema.h:515
+    bool operator==(AlignPackInfo Info) const {
+      return AlignMode == Info.AlignMode && PackNumber == Info.PackNumber;
+    }
----------------
jasonliu wrote:
> This could return true when `PackAttr` in AlignPackInfo are not the same. 
> Wouldn't that cause an issue?
(1) You mean we have two `AlignPackInfo` with same AlignMode and PackNumber, 
but one is PackAttr and the other one is AlignAttr?
The example I can think of is:


```
a)#pragma align(packed)
  #pragma pack(1)   //AlignMode = Packed, PackNumber = 1

b) #pragma align(packed)  //AlignMode = Packed, PackNumber = 1
```

But I don't think we have any issue in this case. Before and after my patch, a 
== b.
Please let me know any other cases concerning you if any.

(2) However, your concerns leads me to think of another case, where behavior 
changes with my patch.

```
a) 
#pragma align(natural)
#pragma pack(1)   /AlignMode = Native,  PackNumber = 1

b)
#pragma align(packed) ///AlignMode = Packed, PackNumber = 1

```
Without this patch, a == b for other targets.
And I suppose a != b for AIX.



================
Comment at: clang/lib/Sema/SemaAttr.cpp:403
   // Warn about modified alignment after #includes.
   if (PrevPackState.CurrentValue != PackStack.CurrentValue) {
     Diag(IncludeLoc, diag::warn_pragma_pack_modified_after_include);
----------------
jasonliu wrote:
> Since we changed the PackStack for it to contain AlignPackInfo instead of 
> unsigned. 
> This stack no longer only contains Pack information. So we need to rethink 
> about how this diagnostic and the one follows should work.
> i.e. What's the purpose of these diagnostic? Is it still only for pragma pack 
> report? If so, what we are doing here is not correct, since the 
> `CurrentValue` could be different, not because of the pragma pack change, but 
> because of the pragma align change.
> If it's not only for pragma pack any more, but also intend to detect the 
> pragma align interaction, then possibly function name and diagnostic needs 
> some modification, as they don't match the intent any more.
Thanks for pointing this out. I agree that what we are doing here is not 
correct. 
The original commit[45b40147117668ce65bff4f6a240bdae4ad4bf7d] message shows:

```
    This commit adds a new -Wpragma-pack warning. It warns in the following 
cases:
    
    - When a translation unit is missing terminating #pragma pack (pop) 
directives.
    - When entering an included file if the current alignment value as 
determined
      by '#pragma pack' directives is different from the default alignment 
value.
    - When leaving an included file that changed the state of the current 
alignment
      value.
```

So it looks these warnings are used only for `pragma pack`.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87702/new/

https://reviews.llvm.org/D87702

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

Reply via email to