PR: PR23931
Differential Revision: http://reviews.llvm.org/D10752
Reviewed by: rsmith
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240889
91177308-0d34-0410-b5e6-
96231b3b80d8
def err_mutable_const : Error<"'mutable' and 'const' cannot be mixed">;
def err_mutable_nonmember : Error<
"'mutable' can only be applied to member variables">;
+def err_virtual_in_union : Error<
+ "unions cannot have virtual functions">;
def err_virtual_non_function : Error<
"'virtual' can only appear on non-static member functions">;
def err_virtual_out_of_class : Error<
dyn_cast<CXXRecordDecl>(NewFD->getDeclContext())) {
if (Parent->isInterface() && cast<CXXMethodDecl>(NewFD)->isUserProvided())
NewFD->setPure(true);
+
+ // C++ [class.union]p2
+ // A union can have member functions, but not virtual functions.
+ if (isVirtual && Parent->isUnion())
+ Diag(D.getDeclSpec().getVirtualSpecLoc(), diag::err_virtual_in_union);
}
SetNestedNameSpecifier(NewFD, D);
--- /dev/null
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+union x {
+ virtual void f(); // expected-error {{unions cannot have virtual functions}}
+};