diff options
author | Nico Weber <nicolasweber@gmx.de> | 2016-02-24 20:58:14 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2016-02-24 20:58:14 +0000 |
commit | 72c57f49c4b5638626f5a6ff91187f33976c321f (patch) | |
tree | 3d8c99b1f56ff215647d1c013746fd6ced3faf02 /clang/lib/AST/DeclCXX.cpp | |
parent | 57ca270b7abcf143f7931d39b36c38455022ec0f (diff) | |
download | bcm5719-llvm-72c57f49c4b5638626f5a6ff91187f33976c321f.tar.gz bcm5719-llvm-72c57f49c4b5638626f5a6ff91187f33976c321f.zip |
Fix rejects-valid caused by r261297.
r261297 called hasUserProvidedDefaultConstructor() to check if defining a
const object is ok. This is incorrect for this example:
struct X { template<typename ...T> X(T...); int n; };
const X x; // formerly OK, now bogus error
Instead, track if a class has a defaulted default constructor, and disallow
a const object for classes that either have defaulted default constructors or
if they need an implicit constructor.
Bug report and fix approach by Richard Smith, thanks!
llvm-svn: 261770
Diffstat (limited to 'clang/lib/AST/DeclCXX.cpp')
-rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index e84b91388fb..65bfc49daec 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -61,6 +61,7 @@ CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D) DefaultedDestructorIsDeleted(false), HasTrivialSpecialMembers(SMF_All), DeclaredNonTrivialSpecialMembers(0), HasIrrelevantDestructor(true), HasConstexprNonCopyMoveConstructor(false), + HasDefaultedDefaultConstructor(false), DefaultedDefaultConstructorIsConstexpr(true), HasConstexprDefaultConstructor(false), HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false), @@ -497,6 +498,8 @@ void CXXRecordDecl::addedMember(Decl *D) { data().UserProvidedDefaultConstructor = true; if (Constructor->isConstexpr()) data().HasConstexprDefaultConstructor = true; + if (Constructor->isDefaulted()) + data().HasDefaultedDefaultConstructor = true; } if (!FunTmpl) { |