From 35d276f443462249b436951c1c663820569e1768 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 27 Feb 2009 18:53:28 +0000 Subject: [PATCH] upgrade various 'implicit int' warnings from an ext-warn to warning when not in C89 mode. This makes it enabled by default instead of only enabled with -pedantic. Clang defaults to c99 mode, so people will see this more often than with GCC, but they can always use -std=c89 if they really want c89. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65647 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.def | 6 ++++-- lib/Sema/SemaType.cpp | 10 +++++----- test/Parser/MicrosoftExtensions.c | 2 +- test/Parser/objc-forcollection-neg-2.m | 2 +- test/Parser/traditional_arg_scope.c | 6 +++--- test/Parser/typeof.c | 2 +- test/Sema/address_spaces.c | 2 +- test/Sema/block-literal.c | 2 +- test/Sema/implicit-int.c | 10 ++++++++-- test/Sema/invalid-decl.c | 2 +- test/Sema/invalid-struct-init.c | 5 ++++- 11 files changed, 30 insertions(+), 19 deletions(-) diff --git a/include/clang/Basic/DiagnosticSemaKinds.def b/include/clang/Basic/DiagnosticSemaKinds.def index 5cd8c6be96..af3c8672ac 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.def +++ b/include/clang/Basic/DiagnosticSemaKinds.def @@ -1413,12 +1413,14 @@ DIAG(err_collection_expr_type, ERROR, // Type DIAG(ext_invalid_sign_spec, EXTENSION, "'%0' cannot be signed or unsigned") -DIAG(ext_missing_declspec, EXTENSION, +DIAG(warn_missing_declspec, WARNING, "declaration specifier missing, defaulting to 'int'") -DIAG(ext_missing_type_specifier, EXTENSION, +DIAG(warn_missing_type_specifier, WARNING, "type specifier missing, defaults to 'int'") DIAG(err_missing_type_specifier, ERROR, "C++ requires a type specifier for all declarations") +DIAG(err_missing_param_declspec, ERROR, + "parameter requires a declaration specifier") DIAG(warn_objc_array_of_interfaces, WARNING, "array of interface %0 should probably be an array of pointers") DIAG(ext_c99_array_usage, EXTENSION, diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index d1dcca6cf1..bfbf8ab952 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -74,10 +74,10 @@ QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS) { // parser already though by it pretending to have seen an 'int' in this // case. if (getLangOptions().ImplicitInt) { - if ((DS.getParsedSpecifiers() & (DeclSpec::PQ_StorageClassSpecifier | - DeclSpec::PQ_TypeSpecifier | - DeclSpec::PQ_TypeQualifier)) == 0) - Diag(DS.getSourceRange().getBegin(), diag::ext_missing_declspec); + // In C89 mode, we only warn if there is a completely missing declspec + // when one is not allowed. + if (DS.isEmpty()) + Diag(DS.getSourceRange().getBegin(), diag::warn_missing_declspec); } else if (!DS.hasTypeSpecifier()) { // C99 and C++ require a type specifier. For example, C99 6.7.2p2 says: // "At least one type specifier shall be given in the declaration @@ -86,7 +86,7 @@ QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS) { // FIXME: Does Microsoft really have the implicit int extension in C++? unsigned DK = getLangOptions().CPlusPlus && !getLangOptions().Microsoft? diag::err_missing_type_specifier - : diag::ext_missing_type_specifier; + : diag::warn_missing_type_specifier; Diag(DS.getSourceRange().getBegin(), DK); } diff --git a/test/Parser/MicrosoftExtensions.c b/test/Parser/MicrosoftExtensions.c index 27283de79c..039bafea09 100644 --- a/test/Parser/MicrosoftExtensions.c +++ b/test/Parser/MicrosoftExtensions.c @@ -11,7 +11,7 @@ void * __ptr64 PtrToPtr64(const void *p) { return((void * __ptr64) (unsigned __int64) (ULONG_PTR)p ); } -__forceinline InterlockedBitTestAndSet (long *Base, long Bit) +__forceinline InterlockedBitTestAndSet (long *Base, long Bit) // expected-warning {{type specifier missing, defaults to 'int'}} { __asm { mov eax, Bit diff --git a/test/Parser/objc-forcollection-neg-2.m b/test/Parser/objc-forcollection-neg-2.m index 308db0579e..31c8097ccb 100644 --- a/test/Parser/objc-forcollection-neg-2.m +++ b/test/Parser/objc-forcollection-neg-2.m @@ -24,7 +24,7 @@ typedef struct objc_object { @implementation MyList (BasicTest) - (void)compilerTestAgainst { - static i; + static i;// expected-warning {{type specifier missing, defaults to 'int'}} for (id el, elem in self) // expected-error {{only one element declaration is allowed}} ++i; for (id el in self) diff --git a/test/Parser/traditional_arg_scope.c b/test/Parser/traditional_arg_scope.c index e1b02567ee..f89708cec1 100644 --- a/test/Parser/traditional_arg_scope.c +++ b/test/Parser/traditional_arg_scope.c @@ -1,7 +1,7 @@ // RUN: clang -fsyntax-only %s -verify -x(a) int a; {return a;} -y(b) int b; {return a;} // expected-error {{use of undeclared identifier}} +int x(a) int a; {return a;} +int y(b) int b; {return a;} // expected-error {{use of undeclared identifier}} // PR2332 -a(a)int a;{a=10;return a;} +int a(a)int a;{a=10;return a;} diff --git a/test/Parser/typeof.c b/test/Parser/typeof.c index 1cf04baefd..ac51f58021 100644 --- a/test/Parser/typeof.c +++ b/test/Parser/typeof.c @@ -11,7 +11,7 @@ static void test() { typeof(TInt) anInt; short TInt eee; // expected-error{{parse error}} void ary[7] fff; // expected-error{{array has incomplete element type 'void'}} expected-error{{parse error}} - typeof(void ary[7]) anIntError; // expected-error{{expected ')'}} expected-note {{to match this '('}} + typeof(void ary[7]) anIntError; // expected-error{{expected ')'}} expected-note {{to match this '('}} expected-warning {{type specifier missing, defaults to 'int'}} typeof(const int) aci; const typeof (*pi) aConstInt; int xx; diff --git a/test/Sema/address_spaces.c b/test/Sema/address_spaces.c index 8900b08b0d..a081b38a8e 100644 --- a/test/Sema/address_spaces.c +++ b/test/Sema/address_spaces.c @@ -5,7 +5,7 @@ #define _AS3 __attribute__((address_space(3))) void foo(_AS3 float *a) { - _AS2 *x; + _AS2 *x;// expected-warning {{type specifier missing, defaults to 'int'}} _AS1 float * _AS2 *B; int _AS1 _AS2 *Y; // expected-error {{multiple address spaces specified for type}} diff --git a/test/Sema/block-literal.c b/test/Sema/block-literal.c index d5d41abb6c..7f64c03c1b 100644 --- a/test/Sema/block-literal.c +++ b/test/Sema/block-literal.c @@ -40,7 +40,7 @@ void test2() { foo: takeclosure(^{ x = 4; }); // expected-error {{variable is not assignable (missing __block type specifier)}} - __block y = 7; + __block y = 7; // expected-warning {{type specifier missing, defaults to 'int'}} takeclosure(^{ y = 8; }); } diff --git a/test/Sema/implicit-int.c b/test/Sema/implicit-int.c index e4a215fb78..f15a40fa08 100644 --- a/test/Sema/implicit-int.c +++ b/test/Sema/implicit-int.c @@ -1,4 +1,10 @@ -// RUN: clang -fsyntax-only %s +// RUN: clang -fsyntax-only %s -verify -pedantic -foo() { +foo() { // expected-warning {{type specifier missing, defaults to 'int'}} } + +y; // expected-warning {{type specifier missing, defaults to 'int'}} + +// rdar://6131634 +void f((x)); // expected-warning {{type specifier missing, defaults to 'int'}} + diff --git a/test/Sema/invalid-decl.c b/test/Sema/invalid-decl.c index efc199d39b..17f316884e 100644 --- a/test/Sema/invalid-decl.c +++ b/test/Sema/invalid-decl.c @@ -6,7 +6,7 @@ void test() { // PR2400 -typedef xtype (*zend_stream_fsizer_t)(void* handle); // expected-error {{function cannot return array or function type}} +typedef xtype (*zend_stream_fsizer_t)(void* handle); // expected-error {{function cannot return array or function type}} expected-warning {{type specifier missing, defaults to 'int'}} expected-warning {{type specifier missing, defaults to 'int'}} typedef struct _zend_module_entry zend_module_entry; struct _zend_module_entry { diff --git a/test/Sema/invalid-struct-init.c b/test/Sema/invalid-struct-init.c index fb96592694..9777a27a0e 100644 --- a/test/Sema/invalid-struct-init.c +++ b/test/Sema/invalid-struct-init.c @@ -3,7 +3,10 @@ typedef struct _zend_module_entry zend_module_entry; struct _zend_module_entry { _efree((p)); // expected-error{{type name requires a specifier or qualifier}} \ - // expected-error{{field '_efree' declared as a function}} + expected-error{{field '_efree' declared as a function}} \ + expected-warning {{type specifier missing, defaults to 'int'}} \ + expected-warning {{type specifier missing, defaults to 'int'}} + }; typedef struct _zend_function_entry { } zend_function_entry; typedef struct _zend_pcre_globals { } zend_pcre_globals; -- 2.40.0