sepavloff added inline comments. ================ Comment at: include/clang/Sema/Sema.h:6619 @@ -6618,1 +6618,3 @@ + ArrayRef<TemplateArgument> varTemplateArguments() const; + ---------------- I would propose to use something like 'getVarTemplateArguments' to make the name more similar to other methods.
================ Comment at: lib/Sema/SemaTemplateInstantiate.cpp:193-205 @@ -185,2 +192,15 @@ +ArrayRef<TemplateArgument> Sema::varTemplateArguments() const { + if (ActiveTemplateInstantiations.empty()) + return ArrayRef<TemplateArgument>(); + + const auto &Inst = ActiveTemplateInstantiations.back(); + + if (const auto *VD = dyn_cast_or_null<VarDecl>(Inst.Entity)) + if (VD->getDescribedVarTemplate() || VD->getTemplateSpecializationKind()) + return Inst.template_arguments(); + + return ArrayRef<TemplateArgument>(); +} + bool Sema::ActiveTemplateInstantiation::isInstantiationRecord() const { ---------------- The code does not seem to be the best solution. It assumes that if instantiation of a variable is requested, its arguments define all parameters needed to instantiate code. It is not so for the code: ``` template<typename T2> struct C1 { template<typename T> static int v1; }; template<typename T2> template<typename T> int C1<T2>::v1 = [](int a = T2(1)) { return a; }(); int main(int argc, char *argv[]) { (void) C1<long*>::v1<int>; return 0; } ``` This problem is caused by different nature of variable templates. When instantiating a function or a class all instantiated entities go to the contexts defined by the class or the function respectively. A variable does not represent a declaration context and its initializer and all declarations created during the instantiation go to enclosing context. So logic in `getTemplateInstantiationArgs` does not work. May be we should extend the logic of `getTemplateInstantiationArgs` so that it supports variable template and still remains recursive? https://reviews.llvm.org/D23096 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits