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