forked from OSchip/llvm-project
Make sure that we're diagnosing duplicate explicit instantiation definitions.
llvm-svn: 84189
This commit is contained in:
parent
3d7e69f2c9
commit
8f003d0fa3
|
@ -3818,8 +3818,11 @@ Sema::ActOnExplicitInstantiation(Scope *S,
|
|||
CheckExplicitInstantiationScope(*this, Record, NameLoc, true);
|
||||
|
||||
// Verify that it is okay to explicitly instantiate here.
|
||||
if (CXXRecordDecl *PrevDecl
|
||||
= cast_or_null<CXXRecordDecl>(Record->getPreviousDeclaration())) {
|
||||
CXXRecordDecl *PrevDecl
|
||||
= cast_or_null<CXXRecordDecl>(Record->getPreviousDeclaration());
|
||||
if (!PrevDecl && Record->getDefinition(Context))
|
||||
PrevDecl = Record;
|
||||
if (PrevDecl) {
|
||||
MemberSpecializationInfo *MSInfo = PrevDecl->getMemberSpecializationInfo();
|
||||
bool SuppressNew = false;
|
||||
assert(MSInfo && "No member specialization information?");
|
||||
|
@ -4065,6 +4068,9 @@ Sema::DeclResult Sema::ActOnExplicitInstantiation(Scope *S,
|
|||
}
|
||||
|
||||
FunctionDecl *PrevDecl = Specialization->getPreviousDeclaration();
|
||||
if (!PrevDecl && Specialization->isThisDeclarationADefinition())
|
||||
PrevDecl = Specialization;
|
||||
|
||||
if (PrevDecl) {
|
||||
bool SuppressNew = false;
|
||||
if (CheckSpecializationInstantiationRedecl(*this, D.getIdentifierLoc(), TSK,
|
||||
|
|
|
@ -1258,7 +1258,10 @@ void Sema::InstantiateStaticDataMemberDefinition(
|
|||
|
||||
if (Var) {
|
||||
Var->setPreviousDeclaration(OldVar);
|
||||
Var->setTemplateSpecializationKind(OldVar->getTemplateSpecializationKind());
|
||||
MemberSpecializationInfo *MSInfo = OldVar->getMemberSpecializationInfo();
|
||||
assert(MSInfo && "Missing member specialization information?");
|
||||
Var->setTemplateSpecializationKind(MSInfo->getTemplateSpecializationKind(),
|
||||
MSInfo->getPointOfInstantiation());
|
||||
DeclGroupRef DG(Var);
|
||||
Consumer.HandleTopLevelDecl(DG);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
// RUN: clang-cc -fsyntax-only -verify %s
|
||||
|
||||
template<typename T> inline void f(T) { }
|
||||
template void f(int); // expected-note{{previous explicit instantiation}}
|
||||
template void f(int); // expected-error{{duplicate explicit instantiation}}
|
||||
|
||||
template<typename T>
|
||||
struct X0 {
|
||||
union Inner { };
|
||||
|
||||
void f(T) { }
|
||||
|
||||
static T value;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
T X0<T>::value = 3.14;
|
||||
|
||||
template struct X0<int>; // expected-note{{previous explicit instantiation}}
|
||||
template struct X0<int>; // expected-error{{duplicate explicit instantiation}}
|
||||
|
||||
template void X0<float>::f(float); // expected-note{{previous explicit instantiation}}
|
||||
template void X0<float>::f(float); // expected-error{{duplicate explicit instantiation}}
|
||||
|
||||
template union X0<float>::Inner; // expected-note{{previous explicit instantiation}}
|
||||
template union X0<float>::Inner; // expected-error{{duplicate explicit instantiation}}
|
||||
|
||||
template float X0<float>::value; // expected-note{{previous explicit instantiation}}
|
||||
template float X0<float>::value; // expected-error{{duplicate explicit instantiation}}
|
Loading…
Reference in New Issue