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}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits