forked from OSchip/llvm-project
If a type is non-literal by virtue of being incomplete produce notes
explaining that. llvm-svn: 155598
This commit is contained in:
parent
f333acd686
commit
6ca73133ca
|
@ -1367,6 +1367,8 @@ def err_constexpr_virtual : Error<"virtual function cannot be constexpr">;
|
|||
def err_constexpr_virtual_base : Error<
|
||||
"constexpr %select{member function|constructor}0 not allowed in "
|
||||
"%select{class|struct}1 with virtual base %plural{1:class|:classes}2">;
|
||||
def note_non_literal_incomplete : Note<
|
||||
"incomplete type %0 is not a literal type">;
|
||||
def note_non_literal_virtual_base : Note<"%select{class|struct}0 with virtual "
|
||||
"base %plural{1:class|:classes}1 is not a literal type">;
|
||||
def note_constexpr_virtual_base_here : Note<"virtual base class declared here">;
|
||||
|
|
|
@ -4301,9 +4301,14 @@ bool Sema::RequireLiteralType(SourceLocation Loc, QualType T,
|
|||
|
||||
const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
|
||||
|
||||
// FIXME: Better diagnostic for incomplete class?
|
||||
if (!RD->isCompleteDefinition())
|
||||
// A partially-defined class type can't be a literal type, because a literal
|
||||
// class type must have a trivial destructor (which can't be checked until
|
||||
// the class definition is complete).
|
||||
if (!RD->isCompleteDefinition()) {
|
||||
RequireCompleteType(Loc, ElemType,
|
||||
PDiag(diag::note_non_literal_incomplete) << T);
|
||||
return true;
|
||||
}
|
||||
|
||||
// If the class has virtual base classes, then it's not an aggregate, and
|
||||
// cannot have any constexpr constructors or a trivial default constructor,
|
||||
|
|
|
@ -22,11 +22,11 @@ struct BeingDefined {
|
|||
|
||||
// (implied) - it is complete
|
||||
|
||||
struct Incomplete;
|
||||
struct Incomplete; // expected-note 2{{forward declaration of 'Incomplete'}}
|
||||
template<class T> struct ClassTemp {};
|
||||
|
||||
constexpr Incomplete incomplete = {}; // expected-error {{constexpr variable cannot have non-literal type 'const Incomplete'}}
|
||||
constexpr Incomplete incomplete2[] = {}; // expected-error {{constexpr variable cannot have non-literal type 'Incomplete const[]'}}
|
||||
constexpr Incomplete incomplete = {}; // expected-error {{constexpr variable cannot have non-literal type 'const Incomplete'}} expected-note {{incomplete type 'const Incomplete' is not a literal type}}
|
||||
constexpr Incomplete incomplete2[] = {}; // expected-error {{constexpr variable cannot have non-literal type 'Incomplete const[]'}} expected-note {{incomplete type 'Incomplete const[]' is not a literal type}}
|
||||
constexpr ClassTemp<int> classtemplate = {};
|
||||
constexpr ClassTemp<int> classtemplate2[] = {};
|
||||
|
||||
|
|
Loading…
Reference in New Issue