kadircet added inline comments.

================
Comment at: clang/lib/Index/IndexingContext.cpp:217
+    // Fallback to primary template if this is an incomplete specialization.
+    if (SD->getTemplateSpecializationKind() == TSK_Undeclared)
+      return SD->getSpecializedTemplate()->getTemplatedDecl();
----------------
kadircet wrote:
> maybe return templateddecl iff instantiationpattern is null ?
nit:

```
if(const auto *Temp ...)
 return Temp..;
return templateddecl
```


================
Comment at: clang/lib/Index/IndexingContext.cpp:173
+     // Incomplete template specialization is not instantiated, we still treat
+     // it as an instantiation as we'd like to keep the canonicalized result
+     // consistent.
----------------
not just instantiation but rather **implicit** instantiation.


================
Comment at: clang/lib/Index/IndexingContext.cpp:216
+      return Template;
+    // Fallback to primary template if this is an incomplete specialization.
+    return SD->getSpecializedTemplate()->getTemplatedDecl();
----------------
there might be other reasons for not having an instantiation yet (e.g dependent 
code), maybe just say fallback to class template if no instantiation is 
available yet?


================
Comment at: clang/test/Index/Core/index-instantiated-source.cpp:103
+// explicit instantiations.
+template class Foo<float>;
+Foo<float> t3;
----------------
yes this is an explicit instantiation and will have TSKKind set properly.

but i was talking about an explicit specialization in the example above, i.e:

```
template <> class Foo<float>;
```

which will still have `TSK_Undeclared` (I believe, haven't checked).


and let me make myself clear, I am not opposed to the idea of making this also 
a ref to the primary template instead of the specialization, I just want to 
make sure we spell it out in the comments and tests explicitly.


================
Comment at: clang/test/Index/Core/index-instantiated-source.cpp:104
+template class Foo<float>;
+Foo<float> t3;
+// CHECK: [[@LINE-1]]:1 | class(Gen)/C++ | Foo | 
c:@N@index_specialization@ST>1#T@Foo | <no-cgname> | Ref,RelCont | rel: 1
----------------
this is not valid, as you can't define a variable of incomplete type, this 
needs to be in a function declaration (as I provided in the example) or you can 
also try making this a pointer as you did below.

i.e.:

```
void foo(Foo<float>);
```


================
Comment at: clang/test/Index/Core/index-source.cpp:324
 // CHECK:   RelSpecialization | functionSp | c:@FT@>2#T#NIfunctionSp#v#
-// CHECK: [[@LINE-3]]:17 | class(Gen,TS)/C++ | SpecializationDecl | 
c:@S@SpecializationDecl>#$@S@Cls | <no-cgname> | Ref,RelCont | rel: 1
 // CHECK: [[@LINE-4]]:36 | class/C++ | Cls | c:@S@Cls | <no-cgname> | 
Ref,RelCont | rel: 1
----------------
hokein wrote:
> kadircet wrote:
> > this looks like a regression, previously when indexing this symbol it was 
> > known that first template argument was a `SpecializationDecl<Cls>` now it 
> > is class template instead.
> > 
> > (same for the 2 below)
> yeah, that was my thought previously, but it turns out not -- it is a bug I 
> think, there is no explicit specialization for `SpecializationDecl<Cls>`, so 
> we should give the primary template. 
> 
> Take a look on Line 60 of this file, `TemplCls<int> gtv(0);` it gives the 
> primary class template as well. 
yeah makes sense actually, also this is a Ref, not a decl or def so it is not 
very logical for it to point at some implicit decl.

SGTM


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D74830



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

Reply via email to