Compute whether a class is trivial correctly for template classes with an explicitly deleted or defaulted special member. PR11387.
llvm-svn: 144715
This commit is contained in:
parent
f6b315c081
commit
4134073c4b
|
@ -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()) {
|
||||
|
|
|
@ -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<typename T> class Trivial4 { Trivial4() = default; };
|
||||
static_assert(__has_trivial_constructor(Trivial4<int>), "Trivial4 is trivial");
|
||||
|
||||
template<typename T> class Trivial5 { Trivial5() = delete; };
|
||||
static_assert(__has_trivial_constructor(Trivial5<int>), "Trivial5 is trivial");
|
||||
|
||||
|
|
Loading…
Reference in New Issue