r370100 - Diagnose both _Complex and _Imaginary as C99 extensions.

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 27 12:15:24 PDT 2019


Author: aaronballman
Date: Tue Aug 27 12:15:24 2019
New Revision: 370100

URL: http://llvm.org/viewvc/llvm-project?rev=370100&view=rev
Log:
Diagnose both _Complex and _Imaginary as C99 extensions.

Added:
    cfe/trunk/test/Parser/c99.c
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
    cfe/trunk/lib/Parse/ParseDecl.cpp
    cfe/trunk/test/SemaCXX/compare-cxx2a.cpp
    cfe/trunk/test/SemaCXX/complex-init-list.cpp
    cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=370100&r1=370099&r2=370100&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Tue Aug 27 12:15:24 2019
@@ -124,6 +124,8 @@ def err_duplicate_default_assoc : Error<
 def note_previous_default_assoc : Note<
   "previous default generic association is here">;
 
+def ext_c99_feature : Extension<
+  "'%0' is a C99 extension">, InGroup<C99>;
 def ext_c11_feature : Extension<
   "'%0' is a C11 extension">, InGroup<C11>;
 

Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=370100&r1=370099&r2=370100&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDecl.cpp Tue Aug 27 12:15:24 2019
@@ -3689,10 +3689,14 @@ void Parser::ParseDeclarationSpecifiers(
                                      DiagID);
       break;
     case tok::kw__Complex:
+      if (!getLangOpts().C99)
+        Diag(Tok, diag::ext_c99_feature) << Tok.getName();
       isInvalid = DS.SetTypeSpecComplex(DeclSpec::TSC_complex, Loc, PrevSpec,
                                         DiagID);
       break;
     case tok::kw__Imaginary:
+      if (!getLangOpts().C99)
+        Diag(Tok, diag::ext_c99_feature) << Tok.getName();
       isInvalid = DS.SetTypeSpecComplex(DeclSpec::TSC_imaginary, Loc, PrevSpec,
                                         DiagID);
       break;

Added: cfe/trunk/test/Parser/c99.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/c99.c?rev=370100&view=auto
==============================================================================
--- cfe/trunk/test/Parser/c99.c (added)
+++ cfe/trunk/test/Parser/c99.c Tue Aug 27 12:15:24 2019
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 -verify -pedantic -fsyntax-only -std=c99 %s
+// RUN: %clang_cc1 -verify=expected,ext -pedantic -Wno-comment -fsyntax-only -std=c89 %s
+// RUN: %clang_cc1 -verify=expected,ext -pedantic -fsyntax-only -x c++ %s
+
+double _Imaginary foo; // ext-warning {{'_Imaginary' is a C99 extension}} \
+                       // expected-error {{imaginary types are not supported}}
+double _Complex bar; // ext-warning {{'_Complex' is a C99 extension}}
+

Modified: cfe/trunk/test/SemaCXX/compare-cxx2a.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/compare-cxx2a.cpp?rev=370100&r1=370099&r2=370100&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/compare-cxx2a.cpp (original)
+++ cfe/trunk/test/SemaCXX/compare-cxx2a.cpp Tue Aug 27 12:15:24 2019
@@ -398,8 +398,8 @@ enum class StrongE {};
 enum WeakE { E_One,
              E_Two };
 
-void test_diag(_Complex int ci, _Complex float cf, _Complex double cd, int i, float f, StrongE E1, WeakE E2, int *p) {
-  (void)(ci <=> (_Complex int &)ci);
+void test_diag(_Complex int ci, _Complex float cf, _Complex double cd, int i, float f, StrongE E1, WeakE E2, int *p) {  // expected-warning 3 {{'_Complex' is a C99 extension}}
+  (void)(ci <=> (_Complex int &)ci); // expected-warning {{'_Complex' is a C99 extension}}
   (void)(ci <=> cf);
   (void)(ci <=> i);
   (void)(ci <=> f);
@@ -410,12 +410,12 @@ void test_diag(_Complex int ci, _Complex
   (void)(E2 <=> cf); // expected-error {{invalid operands}}
 }
 
-void test_int(_Complex int x, _Complex int y) {
+void test_int(_Complex int x, _Complex int y) { // expected-warning 2 {{'_Complex' is a C99 extension}}
   auto r = x <=> y;
   ASSERT_EXPR_TYPE(r, std::strong_equality);
 }
 
-void test_double(_Complex double x, _Complex double y) {
+void test_double(_Complex double x, _Complex double y) { // expected-warning 2 {{'_Complex' is a C99 extension}}
   auto r = x <=> y;
   ASSERT_EXPR_TYPE(r, std::weak_equality);
 }

Modified: cfe/trunk/test/SemaCXX/complex-init-list.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/complex-init-list.cpp?rev=370100&r1=370099&r2=370100&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/complex-init-list.cpp (original)
+++ cfe/trunk/test/SemaCXX/complex-init-list.cpp Tue Aug 27 12:15:24 2019
@@ -1,5 +1,4 @@
 // RUN: %clang_cc1 %s -verify -fsyntax-only -pedantic
-// expected-no-diagnostics
 
 // This file tests the clang extension which allows initializing the components
 // of a complex number individually using an initialization list. Basically,
@@ -11,5 +10,4 @@
 // test/Sema/complex-init-list.c.
 
 // Basic testcase
-// (No pedantic warning is necessary because _Complex is not part of C++.)
-_Complex float valid1 = { 1.0f, 2.0f };
+_Complex float valid1 = { 1.0f, 2.0f }; // expected-warning {{'_Complex' is a C99 extension}}

Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp?rev=370100&r1=370099&r2=370100&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp (original)
+++ cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp Tue Aug 27 12:15:24 2019
@@ -1287,13 +1287,13 @@ namespace ExternConstexpr {
 }
 
 namespace ComplexConstexpr {
-  constexpr _Complex float test1 = {};
-  constexpr _Complex float test2 = {1};
-  constexpr _Complex double test3 = {1,2};
-  constexpr _Complex int test4 = {4};
-  constexpr _Complex int test5 = 4;
-  constexpr _Complex int test6 = {5,6};
-  typedef _Complex float fcomplex;
+  constexpr _Complex float test1 = {}; // expected-warning {{'_Complex' is a C99 extension}}
+  constexpr _Complex float test2 = {1}; // expected-warning {{'_Complex' is a C99 extension}}
+  constexpr _Complex double test3 = {1,2}; // expected-warning {{'_Complex' is a C99 extension}}
+  constexpr _Complex int test4 = {4}; // expected-warning {{'_Complex' is a C99 extension}}
+  constexpr _Complex int test5 = 4; // expected-warning {{'_Complex' is a C99 extension}}
+  constexpr _Complex int test6 = {5,6}; // expected-warning {{'_Complex' is a C99 extension}}
+  typedef _Complex float fcomplex; // expected-warning {{'_Complex' is a C99 extension}}
   constexpr fcomplex test7 = fcomplex();
 
   constexpr const double &t2r = __real test3;
@@ -1307,10 +1307,10 @@ namespace ComplexConstexpr {
   static_assert(t2p[1] == 2.0, "");
   static_assert(t2p[2] == 0.0, ""); // expected-error {{constant expr}} expected-note {{one-past-the-end pointer}}
   static_assert(t2p[3] == 0.0, ""); // expected-error {{constant expr}} expected-note {{cannot refer to element 3 of array of 2 elements}}
-  constexpr _Complex float *p = 0;
+  constexpr _Complex float *p = 0; // expected-warning {{'_Complex' is a C99 extension}}
   constexpr float pr = __real *p; // expected-error {{constant expr}} expected-note {{cannot access real component of null}}
   constexpr float pi = __imag *p; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of null}}
-  constexpr const _Complex double *q = &test3 + 1;
+  constexpr const _Complex double *q = &test3 + 1; // expected-warning {{'_Complex' is a C99 extension}}
   constexpr double qr = __real *q; // expected-error {{constant expr}} expected-note {{cannot access real component of pointer past the end}}
   constexpr double qi = __imag *q; // expected-error {{constant expr}} expected-note {{cannot access imaginary component of pointer past the end}}
 




More information about the cfe-commits mailing list