aaron.ballman added inline comments.

================
Comment at: clang/include/clang/AST/TypeLoc.h:923
+  void initializeLocal(ASTContext &Context, SourceLocation loc) {}
+
+  QualType getInnerType() const { return getTypePtr()->getWrappedType(); }
----------------
yonghong-song wrote:
> aaron.ballman wrote:
> > Do we also need something like this? 
> > https://github.com/llvm/llvm-project/blob/main/clang/include/clang/AST/TypeLoc.h#L1187
> I didn't see getLocalDataSize() in AttributedTypeLoc so it is not needed for 
> AttributedTypeLoc. BTFTagAttributedTypeLoc usage is very similar to 
> AttributedTypeLoc, so I think we are fine here.
The main difference is that `AttributedLocInfo` has a member and 
`BTFTagAttributedLocInfo` is empty. This is why I think it's closer to an 
`AdjustedLocInfo` object which also is an empty struct.


================
Comment at: clang/test/Sema/attr-btf_type_tag.c:29
+int g1 = _Generic((int *)0, int __tag1 *: 0);
+int g2 = _Generic((int __tag1 *)0, int *: 0);
+
----------------
I'd like a third test case:
```
int g3 = _Generic(0, int __tag1 * : 0, int * : 0, default : 0); // 
expected-error {{something about duplicate compatible associations}}
```


================
Comment at: clang/test/Sema/attr-btf_type_tag.c:31-37
+// The btf_type_tag attribute will be ignored during overloadable type matching
+void __attribute__((overloadable)) bar1(int __tag1 *a);
+void __attribute__((overloadable)) bar2(int *a);
+void foo2(int *a, int __tag1 *b) {
+  bar1(a);
+  bar2(b);
+}
----------------
yonghong-song wrote:
> aaron.ballman wrote:
> > This test looks confused -- those functions have different names, so 
> > they're not overloading one another. Even if they were named with the same 
> > identifier, it wouldn't be sufficient to test which gets called (you can 
> > redeclare overloads as in https://godbolt.org/z/aebMbY1aM).
> > 
> > I think this case needs a codegen test to see which function is actually 
> > dispatched to.
> sorry for confusion. the test is bad. For the example in the above 
> godbolt.org link, we have
> ```
> __attribute__((overloadable)) void func(int a);
> __attribute__((overloadable)) void func(int a);
> ```
> Such multiple declarations are actually okay since we allow duplicated 
> declarations. As you mentioned, we really want to know which function 
> definition it picks with overloadable attribute.
> I tried a few examples:
> ```
> $ cat test.c
> #if 1
> #define __attr __attribute__((btf_type_tag("tag1")))
> #else
> #define __attr __attribute__((noderef))
> #endif
> 
> void bar1(int __attr *);
> void bar2(int *);
> void isdigit1(int __attr *a) __attribute__((overloadable)) {
>   bar1(a);
> }
> void isdigit1(int *a) __attribute__((overloadable)) {
>   bar2(a);
> }
> 
> void foo(int __attr *a, int *b) {
>   isdigit1(a);
>   isdigit1(b);
> }
> 
> $ clang -g -std=c2x test.c -S -O2 -emit-llvm -DUSE_TAG
> test.c:12:6: error: redefinition of 'isdigit1'
> void isdigit1(int *a) __attribute__((overloadable)) {
>      ^
> test.c:9:6: note: previous definition is here
> void isdigit1(int __attr *a) __attribute__((overloadable)) {
>      ^
> 1 error generated.
> $ clang -g -std=c2x test.c -S -O2 -emit-llvm
> test.c:12:6: error: redefinition of 'isdigit1'
> void isdigit1(int *a) __attribute__((overloadable)) {
>      ^
> test.c:9:6: note: previous definition is here
> void isdigit1(int __attr *a) __attribute__((overloadable)) {
>      ^
> 1 error generated.
> $
> ```
> 
> so just attribute itself cannot differentiate overloadable functions. In the 
> above test.c, if I changed one of isdigle1 and corresponding bar?() function 
> from 'int' to 'float', compilation can succeed.
> 
> So I will add overloadable failure and success case in Sema/ directory. I am 
> not sure whether a codegen case is needed for the case like
> ```
> void bar1(float __attr *);
> void bar2(int *);
> void isdigit1(float __attr *a) __attribute__((overloadable)) {
>   bar1(a);
> }
> void isdigit1(int *a) __attribute__((overloadable)) {
>   bar2(a);
> }
> ```
> or not. But if you think it is necessary, I am happy to add it.
Okay, I am fine with that behavior. CodeGen tests are only necessary if the 
overloads can actually be defined -- since they can't, I think the Sema tests 
are sufficient to show that these are redeclarations and not independent 
overloads.


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

https://reviews.llvm.org/D120296

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

Reply via email to