erik.pilkington added inline comments.

================
Comment at: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:1267-1269
+  // Instantiate the attributes on both the template declaration and the 
associated record declaration.
+  SemaRef.InstantiateAttrsForDecl(TemplateArgs, Pattern, Inst, LateAttrs, 
StartingScope);
+  SemaRef.InstantiateAttrsForDecl(TemplateArgs, Pattern, RecordInst, 
LateAttrs, StartingScope);
----------------
nit: 80 chars.


================
Comment at: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:1268
+  // Instantiate the attributes on both the template declaration and the 
associated record declaration.
+  SemaRef.InstantiateAttrsForDecl(TemplateArgs, Pattern, Inst, LateAttrs, 
StartingScope);
+  SemaRef.InstantiateAttrsForDecl(TemplateArgs, Pattern, RecordInst, 
LateAttrs, StartingScope);
----------------
Why are you instantiating the attributes onto the ClassTemplateDecl? At the 
very least it seems wrong to instantiate attributes from the pattern to the 
ClassTemplateDecl.


================
Comment at: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:1498
 
+  SemaRef.InstantiateAttrsForDecl(TemplateArgs, D, Record, LateAttrs, 
StartingScope);
+
----------------
This line looks too long too.


================
Comment at: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:3247
   InstPartialSpec->setTypeAsWritten(WrittenTy);
 
   // Check the completed partial specialization.
----------------
ldionne wrote:
> I tried adding
> 
> ```
> SemaRef.InstantiateAttrsForDecl(TemplateArgs, 
> ClassTemplate->getTemplatedDecl(), InstPartialSpec, LateAttrs, StartingScope);
> ```
> 
> here, but just like for explicit specializations, that doesn't instantiate 
> the attributes on the `CXXRecordDecl` used to determine mangling.
> 
You mean `SemaRef.InstantiateAttrsForDecl(TemplateArgs, PartialSpec, 
InstPartialSpec, LateAttrs, StartingScope);`?


================
Comment at: clang/test/SemaCXX/PR38913.cpp:19
+};
+C<int>::X<int, long>* c() { return 0; } // CHECK-DAG: @_Z1cB4CTAGv
+
----------------
ldionne wrote:
> This test is failing in the current iteration of the patch.
I think the problem here is that we don't instantiate X<int, long> because it's 
behind the pointer, so we're just considering the primary template. Looks like 
we do add the attribute (with the fix above) here:
```
template<class T> struct C {
  template<class U, class V> struct X { };
  template<class V> struct __attribute__((abi_tag("CTAG"))) X<int, V> { };
};
C<int>::X<int, long> c() { return 0; }
```
But we don't get the right mangling, for some reason. Note that this problem is 
present even in the non-member case. 

I don't think attributes on specializations have particularly good support 
anyways, so I wouldn't really lose any sleep if we "left this to a follow-up". 
Maybe @rsmith has some thoughts here.


Repository:
  rC Clang

https://reviews.llvm.org/D51997



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

Reply via email to