r334763 - [c++17] If a class inherits virtual functions from a base class, it is

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 14 13:03:22 PDT 2018


Author: rsmith
Date: Thu Jun 14 13:03:22 2018
New Revision: 334763

URL: http://llvm.org/viewvc/llvm-project?rev=334763&view=rev
Log:
[c++17] If a class inherits virtual functions from a base class, it is
not an aggregtae.

Modified:
    cfe/trunk/lib/AST/DeclCXX.cpp
    cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp

Modified: cfe/trunk/lib/AST/DeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=334763&r1=334762&r2=334763&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclCXX.cpp (original)
+++ cfe/trunk/lib/AST/DeclCXX.cpp Thu Jun 14 13:03:22 2018
@@ -259,9 +259,13 @@ CXXRecordDecl::setBases(CXXBaseSpecifier
     // 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

Modified: cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp?rev=334763&r1=334762&r2=334763&view=diff
==============================================================================
--- cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp (original)
+++ cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p1.cpp Thu Jun 14 13:03:22 2018
@@ -111,6 +111,11 @@ struct NonAggr6 { // expected-note 3 {{c
 };
 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;
 




More information about the cfe-commits mailing list