From 3bc451593fa44bfc45753e44e37cb4242e714f82 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Tue, 15 Nov 2011 22:39:08 +0000 Subject: [PATCH] Compute whether a class is trivial correctly for template classes with an explicitly deleted or defaulted special member. PR11387. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144715 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaTemplateInstantiateDecl.cpp | 6 ++++++ test/CXX/special/class.ctor/p5-0x.cpp | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index ec5ccd3f8a..865d62e14b 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -1526,6 +1526,12 @@ TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D, SemaRef.CheckOverrideControl(Method); + // If a function is defined as defaulted or deleted, mark it as such now. + if (D->isDefaulted()) + Method->setDefaulted(); + if (D->isDeletedAsWritten()) + Method->setDeletedAsWritten(); + if (FunctionTemplate) { // If there's a function template, let our caller handle it. } else if (Method->isInvalidDecl() && !Previous.empty()) { diff --git a/test/CXX/special/class.ctor/p5-0x.cpp b/test/CXX/special/class.ctor/p5-0x.cpp index c8d206ae37..00c25e8e3a 100644 --- a/test/CXX/special/class.ctor/p5-0x.cpp +++ b/test/CXX/special/class.ctor/p5-0x.cpp @@ -157,7 +157,14 @@ static_assert(!__has_trivial_constructor(NonTrivialDefCtor6), "NonTrivialDefCtor // Otherwise, the default constructor is non-trivial. class Trivial2 { Trivial2() = delete; }; -static_assert(__has_trivial_constructor(Trivial2), "NonTrivialDefCtor2 is trivial"); +static_assert(__has_trivial_constructor(Trivial2), "Trivial2 is trivial"); class Trivial3 { Trivial3() = default; }; -static_assert(__has_trivial_constructor(Trivial3), "NonTrivialDefCtor3 is trivial"); +static_assert(__has_trivial_constructor(Trivial3), "Trivial3 is trivial"); + +template class Trivial4 { Trivial4() = default; }; +static_assert(__has_trivial_constructor(Trivial4), "Trivial4 is trivial"); + +template class Trivial5 { Trivial5() = delete; }; +static_assert(__has_trivial_constructor(Trivial5), "Trivial5 is trivial"); + -- 2.40.0