summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2018-06-14 20:03:22 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2018-06-14 20:03:22 +0000
commitc00e44656dfbcb400af8d7f4fabf8f04d188104d (patch)
tree8ab95d941fc236d711cff5b9688ce88abdf361c6 /clang
parent0c09acd32de56342bbc4af93bb06db48711463e5 (diff)
downloadbcm5719-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
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/AST/DeclCXX.cpp6
-rw-r--r--clang/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp5
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;
OpenPOWER on IntegriCloud