diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-06-14 20:03:22 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-06-14 20:03:22 +0000 |
| commit | c00e44656dfbcb400af8d7f4fabf8f04d188104d (patch) | |
| tree | 8ab95d941fc236d711cff5b9688ce88abdf361c6 | |
| parent | 0c09acd32de56342bbc4af93bb06db48711463e5 (diff) | |
| download | bcm5719-llvm-c00e44656dfbcb400af8d7f4fabf8f04d188104d.tar.gz bcm5719-llvm-c00e44656dfbcb400af8d7f4fabf8f04d188104d.zip | |
[c++17] If a class inherits virtual functions from a base class, it is
not an aggregtae.
llvm-svn: 334763
| -rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 6 | ||||
| -rw-r--r-- | clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp | 5 |
2 files changed, 10 insertions, 1 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index b3607caef64..076e6376d15 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -259,9 +259,13 @@ CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases, // C++ [class.virtual]p1: // A class that declares or inherits a virtual function is called a // polymorphic class. - if (BaseClassDecl->isPolymorphic()) + if (BaseClassDecl->isPolymorphic()) { data().Polymorphic = true; + // An aggregate is a class with [...] no virtual functions. + data().Aggregate = false; + } + // C++0x [class]p7: // A standard-layout class is a class that: [...] // -- has no non-standard-layout base classes diff --git a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp index f4f73a5af8c..e9e9ce57fa7 100644 --- a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp +++ b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp @@ -111,6 +111,11 @@ struct NonAggr6 { // expected-note 3 {{candidate constructor}} }; NonAggr6 na6 = { 42 }; // expected-error {{no matching constructor for initialization of 'NonAggr6'}} +struct NonAggr7 : NonAggr6 { // expected-note 3 {{candidate constructor}} + int n; +}; +NonAggr7 na7 = {{}, 42}; // expected-error {{no matching constructor for initialization of 'NonAggr7'}} + struct DefaultedAggr { int n; |

