From aba43bb13b3aa3e81990989375fba3a902bfe1c2 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 26 May 2009 20:50:29 +0000 Subject: [PATCH] Make sure that CodeGen sees template instantiations. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72433 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaTemplateInstantiate.cpp | 4 ++++ lib/Sema/SemaTemplateInstantiateDecl.cpp | 4 ++++ test/CodeGenCXX/explicit-instantiation.cpp | 11 +++++++++++ 3 files changed, 19 insertions(+) create mode 100644 test/CodeGenCXX/explicit-instantiation.cpp diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index a5b0911788..3c32a21073 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===/ #include "Sema.h" +#include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Expr.h" #include "clang/AST/DeclTemplate.h" @@ -779,6 +780,9 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation, // Exit the scope of this instantiation. CurContext = PreviousContext; + if (!Invalid) + Consumer.HandleTagDeclDefinition(Instantiation); + // If this is an explicit instantiation, instantiate our members, too. if (!Invalid && ExplicitInstantiation) { Inst.Clear(); diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index b9a9ae8c50..90c86ec57e 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -10,6 +10,7 @@ // //===----------------------------------------------------------------------===/ #include "Sema.h" +#include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/DeclVisitor.h" @@ -622,6 +623,9 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, /*IsInstantiation=*/true); CurContext = PreviousContext; + + DeclGroupRef DG(Function); + Consumer.HandleTopLevelDecl(DG); } /// \brief Instantiate the definition of the given variable from its diff --git a/test/CodeGenCXX/explicit-instantiation.cpp b/test/CodeGenCXX/explicit-instantiation.cpp new file mode 100644 index 0000000000..38966aad2d --- /dev/null +++ b/test/CodeGenCXX/explicit-instantiation.cpp @@ -0,0 +1,11 @@ +// RUN: clang-cc -emit-llvm -femit-all-decls -o %t %s && +// RUN: grep "_ZNK4plusIillEclERKiRKl" %t | count 1 + +template +struct plus { + Result operator()(const T& t, const U& u) const { + return t + u; + } +}; + +template struct plus; -- 2.40.0