[clang] 9088ac1 - [Clang] [Sema] Error on reference types inside a union with msvc 1900+ (#102851)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 15 18:02:11 PDT 2024
Author: Max Winkler
Date: 2024-08-15T18:02:08-07:00
New Revision: 9088ac1e8335d32bed275fbd33f0cd1b9bd400d6
URL: https://github.com/llvm/llvm-project/commit/9088ac1e8335d32bed275fbd33f0cd1b9bd400d6
DIFF: https://github.com/llvm/llvm-project/commit/9088ac1e8335d32bed275fbd33f0cd1b9bd400d6.diff
LOG: [Clang] [Sema] Error on reference types inside a union with msvc 1900+ (#102851)
Godbolt for reference: https://godbolt.org/z/ovKjvWc46
I can confirm that this extension is no longer valid in VS2017, VS2019
and VS2022 under `/permissive` and `/permissive-`
MSDN, https://learn.microsoft.com/en-us/cpp/porting/visual-cpp-what-s-new-2003-through-2015?view=msvc-170, says this extension was officially removed in VS2015.
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaDecl.cpp
clang/test/SemaCXX/MicrosoftExtensions.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 598fccfe59bff1..ffdd063ec99037 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -321,6 +321,12 @@ Android Support
Windows Support
^^^^^^^^^^^^^^^
+- Clang no longer allows references inside a union when emulating MSVC 1900+ even if `fms-extensions` is enabled.
+ Starting with VS2015, MSVC 1900, this Microsoft extension is no longer allowed and always results in an error.
+ Clang now follows the MSVC behavior in this scenario.
+ When `-fms-compatibility-version=18.00` or prior is set on the command line this Microsoft extension is still
+ allowed as VS2013 and prior allow it.
+
LoongArch Support
^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 83a652691e2e03..d19a16cf2ba150 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -18507,11 +18507,15 @@ FieldDecl *Sema::CheckFieldDecl(DeclarationName Name, QualType T,
// the program is ill-formed, except when compiling with MSVC extensions
// enabled.
if (EltTy->isReferenceType()) {
- Diag(NewFD->getLocation(), getLangOpts().MicrosoftExt ?
- diag::ext_union_member_of_reference_type :
- diag::err_union_member_of_reference_type)
- << NewFD->getDeclName() << EltTy;
- if (!getLangOpts().MicrosoftExt)
+ const bool HaveMSExt =
+ getLangOpts().MicrosoftExt &&
+ !getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015);
+
+ Diag(NewFD->getLocation(),
+ HaveMSExt ? diag::ext_union_member_of_reference_type
+ : diag::err_union_member_of_reference_type)
+ << NewFD->getDeclName() << EltTy;
+ if (!HaveMSExt)
NewFD->setInvalidDecl();
}
}
diff --git a/clang/test/SemaCXX/MicrosoftExtensions.cpp b/clang/test/SemaCXX/MicrosoftExtensions.cpp
index 98c19975095bbe..7454a01158f6b4 100644
--- a/clang/test/SemaCXX/MicrosoftExtensions.cpp
+++ b/clang/test/SemaCXX/MicrosoftExtensions.cpp
@@ -1,8 +1,10 @@
-// RUN: %clang_cc1 -std=c++17 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify -fms-extensions -fexceptions -fcxx-exceptions -DTEST1
-// RUN: %clang_cc1 -std=c++98 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify=expected,precxx17 -fms-extensions -fexceptions -fcxx-exceptions -DTEST1
-// RUN: %clang_cc1 -std=c++11 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify=expected,precxx17 -fms-extensions -fexceptions -fcxx-exceptions -DTEST1
-// RUN: %clang_cc1 -std=c++14 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify=expected,precxx17 -fexceptions -fcxx-exceptions -DTEST2
-// RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -std=c++11 -fms-compatibility -verify -DTEST3
+// RUN: %clang_cc1 -std=c++17 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify=expected,ms-union-ext -fms-extensions -fexceptions -fcxx-exceptions -DTEST1
+// RUN: %clang_cc1 -std=c++98 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify=expected,precxx17,ms-union-ext -fms-extensions -fexceptions -fcxx-exceptions -DTEST1
+// RUN: %clang_cc1 -std=c++11 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify=expected,precxx17,ms-union-ext -fms-extensions -fexceptions -fcxx-exceptions -DTEST1
+// RUN: %clang_cc1 -std=c++14 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -Wc++11-extensions -Wno-long-long -verify=expected,precxx17,ms-union-ext-disabled -fexceptions -fcxx-exceptions -DTEST2
+// RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -std=c++11 -fms-compatibility -verify=expected,ms-union-ext -DTEST3
+// RUN: %clang_cc1 -std=c++17 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -verify=ms-union-ext -fms-extensions -fms-compatibility-version=18.00
+// RUN: %clang_cc1 -std=c++17 %s -triple i686-pc-win32 -fsyntax-only -Wmicrosoft -verify=ms-union-ext-disabled -fms-extensions -fms-compatibility-version=19.00
#if TEST1
@@ -384,11 +386,6 @@ void TestSP9() {
c3.h(); // Overloaded unary op operand
}
-union u {
- int *i1;
- int &i2; // expected-warning {{union member 'i2' has reference type 'int &', which is a Microsoft extension}}
-};
-
// Property getter using reference.
struct SP11 {
__declspec(property(get=GetV)) int V;
@@ -619,9 +616,12 @@ template<typename T> struct A {};
template<typename T> struct B : A<A<T>> { A<T>::C::D d; }; // expected-warning {{implicit 'typename' is a C++20 extension}}
}
-#else
-
-#error Unknown test mode
-
#endif
+union u {
+ int *i1;
+
+ // ms-union-ext-warning at +2 {{union member 'i2' has reference type 'int &', which is a Microsoft extension}}
+ // ms-union-ext-disabled-error at +1 {{union member 'i2' has reference type 'int &'}}
+ int &i2;
+};
More information about the cfe-commits
mailing list