Author: Yuanfang Chen
Date: 2021-11-09T10:57:38-08:00
New Revision: 7562c64197acbee60c4bb0d211eb699ad24f5bb8

URL: 
https://github.com/llvm/llvm-project/commit/7562c64197acbee60c4bb0d211eb699ad24f5bb8
DIFF: 
https://github.com/llvm/llvm-project/commit/7562c64197acbee60c4bb0d211eb699ad24f5bb8.diff

LOG: [Sema] Mark virtual method declaration in union as invalid

Currently, this is only diagnosed but the decl is not marked invalid. This may 
hit assertions down the path.

This also reverts the fix for PR49534 since it is not needed anymore.

Reviewed By: hubert.reinterpretcast

Differential Revision: https://reviews.llvm.org/D113145

Added: 
    

Modified: 
    clang/lib/Sema/SemaDecl.cpp
    clang/test/SemaCXX/PR49534.cpp
    clang/test/SemaCXX/virtual-function-in-union.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index d61570ee6a104..638fe86c20abc 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -5302,8 +5302,7 @@ Decl *Sema::BuildAnonymousStructOrUnion(Scope *S, 
DeclSpec &DS,
     // trivial in almost all cases, except if a union member has an in-class
     // initializer:
     //   union { int n = 0; };
-    if (!Invalid)
-      ActOnUninitializedDecl(Anon);
+    ActOnUninitializedDecl(Anon);
   }
   Anon->setImplicit();
 
@@ -9109,8 +9108,10 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, 
DeclContext *DC,
 
       // C++ [class.union]p2
       //   A union can have member functions, but not virtual functions.
-      if (isVirtual && Parent->isUnion())
+      if (isVirtual && Parent->isUnion()) {
         Diag(D.getDeclSpec().getVirtualSpecLoc(), diag::err_virtual_in_union);
+        NewFD->setInvalidDecl();
+      }
     }
 
     SetNestedNameSpecifier(*this, NewFD, D);

diff  --git a/clang/test/SemaCXX/PR49534.cpp b/clang/test/SemaCXX/PR49534.cpp
index 8a17402689e66..6b6452257f6a9 100644
--- a/clang/test/SemaCXX/PR49534.cpp
+++ b/clang/test/SemaCXX/PR49534.cpp
@@ -1,6 +1,5 @@
 // RUN: %clang_cc1 -x c++ -fsyntax-only %s -verify
 
 static union {     // expected-warning {{declaration does not declare 
anything}}
-  virtual int a(); // expected-error {{unions cannot have virtual functions}} \
-                   // expected-error {{functions cannot be declared in an 
anonymous union}}
+  virtual int a(); // expected-error {{unions cannot have virtual functions}}
 };

diff  --git a/clang/test/SemaCXX/virtual-function-in-union.cpp 
b/clang/test/SemaCXX/virtual-function-in-union.cpp
index 0c4ba5d32caac..b7cf26618c9fb 100644
--- a/clang/test/SemaCXX/virtual-function-in-union.cpp
+++ b/clang/test/SemaCXX/virtual-function-in-union.cpp
@@ -1,5 +1,8 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s
 
-union x {
-  virtual void f(); // expected-error {{unions cannot have virtual functions}}
+union U {
+  int d;
+  virtual int f() { return d; }; // expected-error {{unions cannot have 
virtual functions}}
 };
+
+int foo() { U u; return u.d; }


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to