diff options
108 files changed, 361 insertions, 320 deletions
diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp index 6a5e341..f6c347a 100644 --- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -1492,8 +1492,8 @@ TEST(DiagsInHeaders, DiagInsideHeader) { TU.AdditionalFiles = {{"a.h", std::string(Header.code())}}; EXPECT_THAT(*TU.build().getDiagnostics(), UnorderedElementsAre(AllOf( - Diag(Main.range(), "in included file: C++ requires a " - "type specifier for all declarations"), + Diag(Main.range(), "in included file: a type specifier is " + "required for all declarations"), withNote(Diag(Header.range(), "error occurred here"))))); } @@ -1506,8 +1506,8 @@ TEST(DiagsInHeaders, DiagInTransitiveInclude) { {"b.h", "no_type_spec; // error-ok"}}; EXPECT_THAT(*TU.build().getDiagnostics(), UnorderedElementsAre( - Diag(Main.range(), "in included file: C++ requires a " - "type specifier for all declarations"))); + Diag(Main.range(), "in included file: a type specifier is " + "required for all declarations"))); } TEST(DiagsInHeaders, DiagInMultipleHeaders) { @@ -1520,10 +1520,10 @@ TEST(DiagsInHeaders, DiagInMultipleHeaders) { {"b.h", "no_type_spec; // error-ok"}}; EXPECT_THAT(*TU.build().getDiagnostics(), UnorderedElementsAre( - Diag(Main.range("a"), "in included file: C++ requires a type " - "specifier for all declarations"), - Diag(Main.range("b"), "in included file: C++ requires a type " - "specifier for all declarations"))); + Diag(Main.range("a"), "in included file: a type specifier is " + "required for all declarations"), + Diag(Main.range("b"), "in included file: a type specifier is " + "required for all declarations"))); } TEST(DiagsInHeaders, PreferExpansionLocation) { @@ -1537,8 +1537,8 @@ TEST(DiagsInHeaders, PreferExpansionLocation) { {"b.h", "#ifndef X\n#define X\nno_type_spec; // error-ok\n#endif"}}; EXPECT_THAT(*TU.build().getDiagnostics(), UnorderedElementsAre(Diag(Main.range(), - "in included file: C++ requires a type " - "specifier for all declarations"))); + "in included file: a type specifier is " + "required for all declarations"))); } TEST(DiagsInHeaders, PreferExpansionLocationMacros) { @@ -1555,8 +1555,8 @@ TEST(DiagsInHeaders, PreferExpansionLocationMacros) { {"c.h", "#ifndef X\n#define X\nno_type_spec; // error-ok\n#endif"}}; EXPECT_THAT(*TU.build().getDiagnostics(), UnorderedElementsAre( - Diag(Main.range(), "in included file: C++ requires a " - "type specifier for all declarations"))); + Diag(Main.range(), "in included file: a type specifier is " + "required for all declarations"))); } TEST(DiagsInHeaders, LimitDiagsOutsideMainFile) { @@ -1584,8 +1584,8 @@ TEST(DiagsInHeaders, LimitDiagsOutsideMainFile) { #endif)cpp"}}; EXPECT_THAT(*TU.build().getDiagnostics(), UnorderedElementsAre( - Diag(Main.range(), "in included file: C++ requires a " - "type specifier for all declarations"))); + Diag(Main.range(), "in included file: a type specifier is " + "required for all declarations"))); } TEST(DiagsInHeaders, OnlyErrorOrFatal) { @@ -1599,8 +1599,8 @@ TEST(DiagsInHeaders, OnlyErrorOrFatal) { TU.AdditionalFiles = {{"a.h", std::string(Header.code())}}; EXPECT_THAT(*TU.build().getDiagnostics(), UnorderedElementsAre(AllOf( - Diag(Main.range(), "in included file: C++ requires " - "a type specifier for all declarations"), + Diag(Main.range(), "in included file: a type specifier is " + "required for all declarations"), withNote(Diag(Header.range(), "error occurred here"))))); } diff --git a/clang-tools-extra/test/clang-tidy/checkers/altera-struct-pack-align-invalid-decl-no-crash.cpp b/clang-tools-extra/test/clang-tidy/checkers/altera-struct-pack-align-invalid-decl-no-crash.cpp index d52ff94..5688c03 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/altera-struct-pack-align-invalid-decl-no-crash.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/altera-struct-pack-align-invalid-decl-no-crash.cpp @@ -3,4 +3,4 @@ struct Foo { member; // no-crash }; -// CHECK-MESSAGES: :[[@LINE-2]]:3: error: C++ requires a type specifier for all declarations [clang-diagnostic-error] +// CHECK-MESSAGES: :[[@LINE-2]]:3: error: a type specifier is required for all declarations [clang-diagnostic-error] diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/export-diagnostics.cpp b/clang-tools-extra/test/clang-tidy/infrastructure/export-diagnostics.cpp index 033798c..16ad4f1 100644 --- a/clang-tools-extra/test/clang-tidy/infrastructure/export-diagnostics.cpp +++ b/clang-tools-extra/test/clang-tidy/infrastructure/export-diagnostics.cpp @@ -20,7 +20,7 @@ struct Foo { // CHECK-MESSAGES: -input.cpp:3:7: error: 'a' declared as an array with a negative size [clang-diagnostic-error] // CHECK-MESSAGES: -input.cpp:4:7: warning: zero size arrays are an extension [clang-diagnostic-zero-length-array] // CHECK-MESSAGES: -input.cpp:6:11: error: unknown type name 'x' [clang-diagnostic-error] -// CHECK-MESSAGES: -input.cpp:8:3: error: C++ requires a type specifier for all declarations [clang-diagnostic-error] +// CHECK-MESSAGES: -input.cpp:8:3: error: a type specifier is required for all declarations [clang-diagnostic-error] // CHECK-YAML: --- // CHECK-YAML-NEXT: MainSourceFile: '{{.*}}-input.cpp' @@ -88,7 +88,7 @@ struct Foo { // CHECK-YAML-NEXT: BuildDirectory: '{{.*}}' // CHECK-YAML-NEXT: - DiagnosticName: clang-diagnostic-error // CHECK-YAML-NEXT: DiagnosticMessage: -// CHECK-YAML-NEXT: Message: 'C++ requires a type specifier for all declarations' +// CHECK-YAML-NEXT: Message: a type specifier is required for all declarations // CHECK-YAML-NEXT: FilePath: '{{.*}}-input.cpp' // CHECK-YAML-NEXT: FileOffset: 86 // CHECK-YAML-NEXT: Replacements: [] diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ca8d9a4..74d1800 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -170,7 +170,17 @@ Improvements to Clang's diagnostics ``-Wno-implicit-function-declaration``. As of C2x, support for implicit function declarations has been removed, and the warning options will have no effect. - +- The ``-Wimplicit-int`` warning diagnostic now defaults to an error in C99 and + later. Prior to C2x, it may be downgraded to a warning with + ``-Wno-error=implicit-int``, or disabled entirely with ``-Wno-implicit-int``. + As of C2x, support for implicit int has been removed, and the warning options + will have no effect. Specifying ``-Wimplicit-int`` in C89 mode will now issue + warnings instead of being a noop. +- No longer issue a "declaration specifiers missing, defaulting to int" + diagnostic in C89 mode because it is not an extension in C89, it was valid + code. The diagnostic has been removed entirely as it did not have a + diagnostic group to disable it, but it can be covered wholly by + ``-Wimplicit-int``. - ``-Wmisexpect`` warns when the branch weights collected during profiling conflict with those added by ``llvm.expect``. diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td index 66defc1..c140a33 100644 --- a/clang/include/clang/Basic/DiagnosticCommonKinds.td +++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td @@ -123,7 +123,9 @@ def err_enum_template : Error<"enumeration cannot be a template">; def warn_cxx20_compat_consteval : Warning< "'consteval' specifier is incompatible with C++ standards before C++20">, InGroup<CXX20Compat>, DefaultIgnore; - +def warn_missing_type_specifier : Warning< + "type specifier missing, defaults to 'int'">, + InGroup<ImplicitInt>, DefaultIgnore; } let CategoryName = "Nullability Issue" in { diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 084d67a..45540fa 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -4341,8 +4341,9 @@ def err_void_param_qualified : Error< "'void' as parameter must not have type qualifiers">; def err_ident_list_in_fn_declaration : Error< "a parameter list without types is only allowed in a function definition">; -def ext_param_not_declared : Extension< - "parameter %0 was not declared, defaulting to type 'int'">; +def ext_param_not_declared : ExtWarn< + "parameter %0 was not declared, defaults to 'int'; ISO C99 and later do not " + "support implicit int">, InGroup<ImplicitInt>, DefaultError; def err_param_default_argument : Error< "C does not support default arguments">; def err_param_default_argument_redefinition : Error< @@ -9997,15 +9998,13 @@ def warn_receiver_forward_class : Warning< "receiver %0 is a forward class and corresponding @interface may not exist">, InGroup<ForwardClassReceiver>; def note_method_sent_forward_class : Note<"method %0 is used for the forward class">; -def ext_missing_declspec : ExtWarn< - "declaration specifier missing, defaulting to 'int'">; def ext_missing_type_specifier : ExtWarn< - "type specifier missing, defaults to 'int'">, - InGroup<ImplicitInt>; + "type specifier missing, defaults to 'int'; ISO C99 and later do not support " + "implicit int">, InGroup<ImplicitInt>, DefaultError; +def err_missing_type_specifier : Error< + "a type specifier is required for all declarations">; def err_decimal_unsupported : Error< "GNU decimal type extension not supported">; -def err_missing_type_specifier : Error< - "C++ requires a type specifier for all declarations">; def err_objc_array_of_interfaces : Error< "array of interface %0 is invalid (probably should be an array of pointers)">; def ext_c99_array_usage : Extension< diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 5c62c4c..bd66461 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -120,7 +120,6 @@ BENIGN_LANGOPT(AsmPreprocessor, 1, 0, "preprocessor in asm mode") LANGOPT(GNUMode , 1, 1, "GNU extensions") LANGOPT(GNUKeywords , 1, 1, "GNU keywords") VALUE_LANGOPT(GNUCVersion , 32, 0, "GNU C compatibility version") -BENIGN_LANGOPT(ImplicitInt, 1, 0, "C89 implicit 'int'") LANGOPT(DisableKNRFunctions, 1, 0, "require function types to have a prototype") LANGOPT(Digraphs , 1, 0, "digraphs") BENIGN_LANGOPT(HexFloats , 1, 0, "C99 hexadecimal float constants") diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index 83b8c06..caea03a 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -537,6 +537,12 @@ public: return !requiresStrictPrototypes() && !OpenCL; } + /// Returns true if implicit int is part of the language requirements. + bool isImplicitIntRequired() const { return !CPlusPlus && !C99; } + + /// Returns true if implicit int is supported at all. + bool isImplicitIntAllowed() const { return !CPlusPlus && !C2x; } + /// Check if return address signing is enabled. bool hasSignReturnAddress() const { return getSignReturnAddressScope() != SignReturnAddressScopeKind::None; diff --git a/clang/include/clang/Basic/LangStandard.h b/clang/include/clang/Basic/LangStandard.h index 263985d..4e78570 100644 --- a/clang/include/clang/Basic/LangStandard.h +++ b/clang/include/clang/Basic/LangStandard.h @@ -59,9 +59,8 @@ enum LangFeatures { Digraphs = (1 << 11), GNUMode = (1 << 12), HexFloat = (1 << 13), - ImplicitInt = (1 << 14), - OpenCL = (1 << 15), - HLSL = (1 << 16) + OpenCL = (1 << 14), + HLSL = (1 << 15) }; /// LangStandard - Information about the properties of a particular language @@ -131,9 +130,6 @@ public: /// hasHexFloats - Language supports hexadecimal float constants. bool hasHexFloats() const { return Flags & HexFloat; } - /// hasImplicitInt - Language allows variables to be typed as int implicitly. - bool hasImplicitInt() const { return Flags & ImplicitInt; } - /// isOpenCL - Language is a OpenCL variant. bool isOpenCL() const { return Flags & OpenCL; } diff --git a/clang/include/clang/Basic/LangStandards.def b/clang/include/clang/Basic/LangStandards.def index d0e777b..323032f 100644 --- a/clang/include/clang/Basic/LangStandards.def +++ b/clang/include/clang/Basic/LangStandards.def @@ -36,18 +36,17 @@ // C89-ish modes. LANGSTANDARD(c89, "c89", - C, "ISO C 1990", - ImplicitInt) + C, "ISO C 1990", 0) LANGSTANDARD_ALIAS(c89, "c90") LANGSTANDARD_ALIAS(c89, "iso9899:1990") LANGSTANDARD(c94, "iso9899:199409", C, "ISO C 1990 with amendment 1", - Digraphs | ImplicitInt) + Digraphs) LANGSTANDARD(gnu89, "gnu89", C, "ISO C 1990 with GNU extensions", - LineComment | Digraphs | GNUMode | ImplicitInt) + LineComment | Digraphs | GNUMode) LANGSTANDARD_ALIAS(gnu89, "gnu90") // C99-ish modes diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index 8c19d7e..2bc791c 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -113,7 +113,6 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang, Opts.GNUMode = Std.isGNUMode(); Opts.GNUCVersion = 0; Opts.HexFloats = Std.hasHexFloats(); - Opts.ImplicitInt = Std.hasImplicitInt(); Opts.WChar = Std.isCPlusPlus(); Opts.Digraphs = Std.hasDigraphs(); diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 2b386c8..3d18ffe 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -2637,8 +2637,8 @@ bool Parser::ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS, // error, do lookahead to try to do better recovery. This never applies // within a type specifier. Outside of C++, we allow this even if the // language doesn't "officially" support implicit int -- we support - // implicit int as an extension in C99 and C11. - if (!isTypeSpecifier(DSC) && !getLangOpts().CPlusPlus && + // implicit int as an extension in some language modes. + if (!isTypeSpecifier(DSC) && getLangOpts().isImplicitIntAllowed() && isValidAfterIdentifierInDeclarator(NextToken())) { // If this token is valid for implicit int, e.g. "static x = 4", then // we just avoid eating the identifier, so it will be parsed as the diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index e72dd93..7ffaf05 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -1195,10 +1195,12 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, const DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo(); TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth); - // If this is C90 and the declspecs were completely missing, fudge in an + // If this is C89 and the declspecs were completely missing, fudge in an // implicit int. We do this here because this is the only place where // declaration-specifiers are completely optional in the grammar. - if (getLangOpts().ImplicitInt && D.getDeclSpec().isEmpty()) { + if (getLangOpts().isImplicitIntRequired() && D.getDeclSpec().isEmpty()) { + Diag(D.getIdentifierLoc(), diag::warn_missing_type_specifier) + << D.getDeclSpec().getSourceRange(); const char *PrevSpec; unsigned DiagID; const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy(); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index f2b87c6..0876e6e 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -14317,18 +14317,28 @@ void Sema::ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D, SourceLocation LocAfterDecls) { DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo(); - // Verify 6.9.1p6: 'every identifier in the identifier list shall be declared' - // for a K&R function. + // C99 6.9.1p6 "If a declarator includes an identifier list, each declaration + // in the declaration list shall have at least one declarator, those + // declarators shall only declare identifiers from the identifier list, and + // every identifier in the identifier list shall be declared. + // + // C89 3.7.1p5 "If a declarator includes an identifier list, only the + // identifiers it names shall be declared in the declaration list." + // + // This is why we only diagnose in C99 and later. Note, the other conditions + // listed are checked elsewhere. if (!FTI.hasPrototype) { for (int i = FTI.NumParams; i != 0; /* decrement in loop */) { --i; if (FTI.Params[i].Param == nullptr) { - SmallString<256> Code; - llvm::raw_svector_ostream(Code) - << " int " << FTI.Params[i].Ident->getName() << ";\n"; - Diag(FTI.Params[i].IdentLoc, diag::ext_param_not_declared) - << FTI.Params[i].Ident - << FixItHint::CreateInsertion(LocAfterDecls, Code); + if (getLangOpts().C99) { + SmallString<256> Code; + llvm::raw_svector_ostream(Code) + << " int " << FTI.Params[i].Ident->getName() << ";\n"; + Diag(FTI.Params[i].IdentLoc, diag::ext_param_not_declared) + << FTI.Params[i].Ident + << FixItHint::CreateInsertion(LocAfterDecls, Code); + } // Implicitly declare the argument as type 'int' for lack of a better // type. diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index a037956d..631a532 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1343,35 +1343,34 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { // allowed to be completely missing a declspec. This is handled in the // parser already though by it pretending to have seen an 'int' in this // case. - if (S.getLangOpts().ImplicitInt) { - // In C89 mode, we only warn if there is a completely missing declspec - // when one is not allowed. - if (DS.isEmpty()) { - S.Diag(DeclLoc, diag::ext_missing_declspec) - << DS.getSourceRange() - << FixItHint::CreateInsertion(DS.getBeginLoc(), "int"); - } + if (S.getLangOpts().isImplicitIntRequired()) { + S.Diag(DeclLoc, diag::warn_missing_type_specifier) + << DS.getSourceRange() + << FixItHint::CreateInsertion(DS.getBeginLoc(), "int"); } 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 // specifiers in each declaration, and in the specifier-qualifier list in // each struct declaration and type name." - if (S.getLangOpts().CPlusPlus && !DS.isTypeSpecPipe()) { + if (!S.getLangOpts().isImplicitIntAllowed() && !DS.isTypeSpecPipe()) { S.Diag(DeclLoc, diag::err_missing_type_specifier) - << DS.getSourceRange(); + << DS.getSourceRange(); - // When this occurs in C++ code, often something is very broken with the - // value being declared, poison it as invalid so we don't get chains of + // When this occurs, often something is very broken with the value + // being declared, poison it as invalid so we don't get chains of // errors. declarator.setInvalidType(true); } else if (S.getLangOpts().getOpenCLCompatibleVersion() >= 200 && DS.isTypeSpecPipe()) { S.Diag(DeclLoc, diag::err_missing_actual_pipe_type) - << DS.getSourceRange(); + << DS.getSourceRange(); declarator.setInvalidType(true); } else { + assert(S.getLangOpts().isImplicitIntAllowed() && + "implicit int is disabled?"); S.Diag(DeclLoc, diag::ext_missing_type_specifier) - << DS.getSourceRange(); + << DS.getSourceRange() + << FixItHint::CreateInsertion(DS.getBeginLoc(), "int"); } } diff --git a/clang/test/Analysis/PR49642.c b/clang/test/Analysis/PR49642.c index b9bc27a..6d8c658 100644 --- a/clang/test/Analysis/PR49642.c +++ b/clang/test/Analysis/PR49642.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -Wno-implicit-function-declaration -w -verify %s \ +// RUN: %clang_analyze_cc1 -Wno-implicit-function-declaration -Wno-implicit-int -w -verify %s \ // RUN: -analyzer-checker=core \ // RUN: -analyzer-checker=apiModeling.StdCLibraryFunctions diff --git a/clang/test/Analysis/inline-unique-reports.c b/clang/test/Analysis/inline-unique-reports.c index 9c1553b..e58870e 100644 --- a/clang/test/Analysis/inline-unique-reports.c +++ b/clang/test/Analysis/inline-unique-reports.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 %s -analyzer-checker=core.NullDereference -analyzer-output=plist -o %t > /dev/null 2>&1 +// RUN: %clang_analyze_cc1 %s -analyzer-checker=core.NullDereference -analyzer-output=plist -Wno-error=implicit-int -o %t > /dev/null 2>&1 // RUN: %normalize_plist <%t | diff -ub %S/Inputs/expected-plists/inline-unique-reports.c.plist - static inline bug(int *p) { diff --git a/clang/test/Analysis/malloc.c b/clang/test/Analysis/malloc.c index daf5d71..7282a74 100644 --- a/clang/test/Analysis/malloc.c +++ b/clang/test/Analysis/malloc.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -Wno-strict-prototypes -analyzer-store=region -verify %s \ +// RUN: %clang_analyze_cc1 -Wno-strict-prototypes -Wno-error=implicit-int -analyzer-store=region -verify %s \ // RUN: -analyzer-checker=core \ // RUN: -analyzer-checker=alpha.deadcode.UnreachableCode \ // RUN: -analyzer-checker=alpha.core.CastSize \ diff --git a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p2.cpp b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p2.cpp index 83b12d4..a71c654 100644 --- a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p2.cpp +++ b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p2.cpp @@ -7,7 +7,7 @@ struct S { // Note, this is not permitted: conversion-declarator cannot have a trailing return type. // FIXME: don't issue the second diagnostic for this. - operator auto(*)()->int(); // expected-error{{'auto' not allowed in conversion function type}} expected-error {{C++ requires a type specifier}} + operator auto(*)()->int(); // expected-error{{'auto' not allowed in conversion function type}} expected-error {{a type specifier is required}} }; typedef auto Fun(int a) -> decltype(a + a); diff --git a/clang/test/CXX/drs/dr2xx.cpp b/clang/test/CXX/drs/dr2xx.cpp index 52aca02..4a409e5 100644 --- a/clang/test/CXX/drs/dr2xx.cpp +++ b/clang/test/CXX/drs/dr2xx.cpp @@ -1094,7 +1094,7 @@ namespace dr298 { // dr298: yes struct B b; // expected-error {{typedef 'B' cannot be referenced with a struct specifier}} struct C c; // expected-error {{typedef 'C' cannot be referenced with a struct specifier}} - B::B() {} // expected-error {{requires a type specifier}} + B::B() {} // expected-error {{a type specifier is required}} B::A() {} // ok C::~C() {} // expected-error {{destructor cannot be declared using a typedef 'dr298::C' (aka 'const dr298::A') of the class name}} diff --git a/clang/test/CXX/drs/dr4xx.cpp b/clang/test/CXX/drs/dr4xx.cpp index 7d06da5..bf4cd54 100644 --- a/clang/test/CXX/drs/dr4xx.cpp +++ b/clang/test/CXX/drs/dr4xx.cpp @@ -1054,7 +1054,7 @@ namespace dr484 { // dr484: yes struct N::DT {}; // expected-error {{conflicts with typedef}} typedef struct { - S(); // expected-error {{requires a type}} + S(); // expected-error {{a type specifier is required}} } S; } diff --git a/clang/test/CXX/drs/dr5xx.cpp b/clang/test/CXX/drs/dr5xx.cpp index 2099612..9e86995 100644 --- a/clang/test/CXX/drs/dr5xx.cpp +++ b/clang/test/CXX/drs/dr5xx.cpp @@ -162,7 +162,7 @@ namespace dr522 { // dr522: yes template<typename T> void b3(Base<T> *); void test(int n, const int cn, int **p, int *S::*pm) { - int *a[3], *S::*am[3]; + int *a[3], *S::*am[3]; const Derived cd = Derived(); Derived d[3]; @@ -413,20 +413,20 @@ namespace dr535 { // dr535: yes // dr538: na // dr539: yes -const dr539( // expected-error {{requires a type specifier}} +const dr539( // expected-error {{a type specifier is required}} const a) { // expected-error {{unknown type name 'a'}} - const b; // expected-error {{requires a type specifier}} + const b; // expected-error {{a type specifier is required}} new const; // expected-error {{expected a type}} try {} catch (const n) {} // expected-error {{unknown type name 'n'}} try {} catch (const) {} // expected-error {{expected a type}} - if (const n = 0) {} // expected-error {{requires a type specifier}} - switch (const n = 0) {} // expected-error {{requires a type specifier}} - while (const n = 0) {} // expected-error {{requires a type specifier}} - for (const n = 0; // expected-error {{requires a type specifier}} - const m = 0; ) {} // expected-error {{requires a type specifier}} - sizeof(const); // expected-error {{requires a type specifier}} + if (const n = 0) {} // expected-error {{a type specifier is required}} + switch (const n = 0) {} // expected-error {{a type specifier is required}} + while (const n = 0) {} // expected-error {{a type specifier is required}} + for (const n = 0; // expected-error {{a type specifier is required}} + const m = 0; ) {} // expected-error {{a type specifier is required}} + sizeof(const); // expected-error {{a type specifier is required}} struct S { - const n; // expected-error {{requires a type specifier}} + const n; // expected-error {{a type specifier is required}} operator const(); // expected-error {{expected a type}} }; #if __cplusplus >= 201103L @@ -435,7 +435,7 @@ const dr539( // expected-error {{requires a type specifier}} // badly confused when recovering here. We should fix this recovery. { for (const n // expected-error {{unknown type name 'n'}} expected-note {{}} : arr) ; {} } // expected-error +{{}} - (void) [](const) {}; // expected-error {{requires a type specifier}} + (void) [](const) {}; // expected-error {{a type specifier is required}} (void) [](const n) {}; // expected-error {{unknown type name 'n'}} enum E : const {}; // expected-error {{expected a type}} using T = const; // expected-error {{expected a type}} @@ -879,7 +879,7 @@ namespace dr585 { // dr585: yes struct A { friend T; #if __cplusplus <= 201402L - // expected-error@-2 {{requires a type specifier}} expected-error@-2 {{can only be classes or functions}} + // expected-error@-2 {{a type specifier is required}} expected-error@-2 {{can only be classes or functions}} #else // expected-error@-4 {{use of class template 'T' requires template arguments; argument deduction not allowed in friend declaration}} // expected-note@-7 {{here}} @@ -891,7 +891,7 @@ namespace dr585 { // dr585: yes template<template<typename> class T> struct B { friend T; #if __cplusplus <= 201402L - // expected-error@-2 {{requires a type specifier}} expected-error@-2 {{can only be classes or functions}} + // expected-error@-2 {{a type specifier is required}} expected-error@-2 {{can only be classes or functions}} #else // expected-error@-4 {{use of template template parameter 'T' requires template arguments; argument deduction not allowed in friend declaration}} // expected-note@-6 {{here}} diff --git a/clang/test/CXX/modules-ts/basic/basic.link/module-declaration.cpp b/clang/test/CXX/modules-ts/basic/basic.link/module-declaration.cpp index 7615536..09e1097 100644 --- a/clang/test/CXX/modules-ts/basic/basic.link/module-declaration.cpp +++ b/clang/test/CXX/modules-ts/basic/basic.link/module-declaration.cpp @@ -36,7 +36,7 @@ EXPORT module MODULE_NAME; // expected-error@-2 {{redefinition of module 'x'}} // expected-note-re@module-declaration.cpp:* {{loaded from '{{.*[/\\]}}x.pcm'}} #elif TEST == 7 -// expected-error@-5 {{expected ';'}} expected-error@-5 {{requires a type specifier}} +// expected-error@-5 {{expected ';'}} expected-error@-5 {{a type specifier is required}} #elif TEST == 9 // expected-warning@-7 {{unknown attribute 'fancy' ignored}} #elif TEST == 10 diff --git a/clang/test/CXX/temp/p3.cpp b/clang/test/CXX/temp/p3.cpp index 90f6397..b708c61 100644 --- a/clang/test/CXX/temp/p3.cpp +++ b/clang/test/CXX/temp/p3.cpp @@ -10,7 +10,7 @@ template<typename T> struct A { static A a; } A<T>::a; // expected-error {{expec expected-error {{use of undeclared identifier 'T'}} template<typename T> struct B { } f(); // expected-error {{expected ';' after struct}} \ - expected-error {{requires a type specifier}} + expected-error {{a type specifier is required}} template<typename T> struct C { } // expected-error {{expected ';' after struct}} diff --git a/clang/test/CXX/temp/temp.deduct.guide/p3.cpp b/clang/test/CXX/temp/temp.deduct.guide/p3.cpp index 4ba6e8e..33f70e5 100644 --- a/clang/test/CXX/temp/temp.deduct.guide/p3.cpp +++ b/clang/test/CXX/temp/temp.deduct.guide/p3.cpp @@ -24,9 +24,9 @@ template<typename T> using B = A<T>; // expected-note {{template}} B() -> B<int>; // expected-error {{cannot specify deduction guide for alias template 'B'}} // FIXME: expected-error@-1 {{declarator requires an identifier}} template<typename T> int C; -C() -> int; // expected-error {{requires a type specifier}} +C() -> int; // expected-error {{a type specifier is required}} template<typename T> void D(); -D() -> int; // expected-error {{requires a type specifier}} +D() -> int; // expected-error {{a type specifier is required}} template<template<typename> typename TT> struct E { // expected-note 2{{template}} // FIXME: Should only diagnose this once! TT(int) -> TT<int>; // expected-error 2{{cannot specify deduction guide for template template parameter 'TT'}} expected-error {{requires an identifier}} diff --git a/clang/test/CXX/temp/temp.res/temp.local/p3.cpp b/clang/test/CXX/temp/temp.res/temp.local/p3.cpp index ac03c72..8809316 100644 --- a/clang/test/CXX/temp/temp.res/temp.local/p3.cpp +++ b/clang/test/CXX/temp/temp.res/temp.local/p3.cpp @@ -4,7 +4,7 @@ template <class T> struct Base { // expected-note@-1 2{{member type 'Base<int>' found by ambiguous name lookup}} // expected-note@-2 2{{member type 'Base<char>' found by ambiguous name lookup}} static void f(); -}; +}; struct X0 { }; @@ -26,7 +26,7 @@ namespace PR6717 { } // expected-error {{expected ';' after class}} WebVector(const WebVector<T>& other) { } // expected-error{{undeclared identifier 'T'}} \ - expected-error{{requires a type specifier}} + expected-error{{a type specifier is required}} template <typename C> WebVector<T>& operator=(const C& other) { } // expected-error{{undeclared identifier 'T'}} diff --git a/clang/test/CodeGen/2002-07-14-MiscTests2.c b/clang/test/CodeGen/2002-07-14-MiscTests2.c index ad13017..4da1e92 100644 --- a/clang/test/CodeGen/2002-07-14-MiscTests2.c +++ b/clang/test/CodeGen/2002-07-14-MiscTests2.c @@ -2,7 +2,7 @@ // Test ?: in function calls -extern fp(int, char*); +extern void fp(int, char*); char *Ext; void __bb_exit_func (void) diff --git a/clang/test/CodeGen/2003-08-20-vfork-bug.c b/clang/test/CodeGen/2003-08-20-vfork-bug.c index 7ec0048..4966ab2 100644 --- a/clang/test/CodeGen/2003-08-20-vfork-bug.c +++ b/clang/test/CodeGen/2003-08-20-vfork-bug.c @@ -1,6 +1,6 @@ // RUN: %clang_cc1 -emit-llvm %s -o /dev/null extern int vfork(void); -test() { +void test() { vfork(); } diff --git a/clang/test/CodeGen/2007-04-24-bit-not-expr.c b/clang/test/CodeGen/2007-04-24-bit-not-expr.c index 9d99caf..094378e 100644 --- a/clang/test/CodeGen/2007-04-24-bit-not-expr.c +++ b/clang/test/CodeGen/2007-04-24-bit-not-expr.c @@ -1,6 +1,6 @@ // PR 1346 // RUN: %clang_cc1 -emit-llvm %s -o /dev/null -extern bar(void *); +extern void bar(void *); void f(void *cd) { bar(((void *)((unsigned long)(cd) ^ -1))); diff --git a/clang/test/CodeGen/2007-09-26-Alignment.c b/clang/test/CodeGen/2007-09-26-Alignment.c index 8ab130b..5d8670aa 100644 --- a/clang/test/CodeGen/2007-09-26-Alignment.c +++ b/clang/test/CodeGen/2007-09-26-Alignment.c @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s -extern p(int *); +extern void p(int *); int q(void) { // CHECK: alloca i32, align 16 int x __attribute__ ((aligned (16))); diff --git a/clang/test/CodeGen/2010-07-14-ref-off-end.c b/clang/test/CodeGen/2010-07-14-ref-off-end.c index 1c1bec8..f7bcfab 100644 --- a/clang/test/CodeGen/2010-07-14-ref-off-end.c +++ b/clang/test/CodeGen/2010-07-14-ref-off-end.c @@ -6,13 +6,13 @@ struct T unsigned i:8; unsigned c:24; }; -f(struct T t) +int f(struct T t) { struct T s[1]; s[0]=t; return(char)s->c; } -main(void) +int main(void) { // CHECK: getelementptr inbounds [1 x %struct.T], [1 x %struct.T]* %s, i32 0, i32 0 // CHECK: getelementptr inbounds [1 x %struct.T], [1 x %struct.T]* %s, i32 0, i32 0 diff --git a/clang/test/CodeGen/mips-clobber-reg.c b/clang/test/CodeGen/mips-clobber-reg.c index 18b6a72..3bcf07b 100644 --- a/clang/test/CodeGen/mips-clobber-reg.c +++ b/clang/test/CodeGen/mips-clobber-reg.c @@ -12,7 +12,7 @@ Any bad names will make the frontend choke. */ -main(void) +int main(void) { __asm__ __volatile__ (".set noat \n\t addi $7,$at,77":::"at"); diff --git a/clang/test/CodeGen/mips-vector-arg.c b/clang/test/CodeGen/mips-vector-arg.c index 511fca8..d73e6ce 100644 --- a/clang/test/CodeGen/mips-vector-arg.c +++ b/clang/test/CodeGen/mips-vector-arg.c @@ -9,19 +9,19 @@ typedef float v4sf __attribute__ ((__vector_size__ (16))); typedef int v4i32 __attribute__ ((__vector_size__ (16))); // O32: define{{.*}} void @test_v4sf(i32 inreg noundef %a1.coerce0, i32 inreg noundef %a1.coerce1, i32 inreg noundef %a1.coerce2, i32 inreg noundef %a1.coerce3, i32 noundef signext %a2, i32 %0, i32 inreg noundef %a3.coerce0, i32 inreg noundef %a3.coerce1, i32 inreg noundef %a3.coerce2, i32 inreg noundef %a3.coerce3) local_unnamed_addr [[NUW:#[0-9]+]] -// O32: declare i32 @test_v4sf_2(i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 noundef signext, i32, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef) +// O32: declare void @test_v4sf_2(i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 noundef signext, i32, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef) // N64: define{{.*}} void @test_v4sf(i64 inreg noundef %a1.coerce0, i64 inreg noundef %a1.coerce1, i32 noundef signext %a2, i64 %0, i64 inreg noundef %a3.coerce0, i64 inreg noundef %a3.coerce1) local_unnamed_addr [[NUW:#[0-9]+]] -// N64: declare signext i32 @test_v4sf_2(i64 inreg noundef, i64 inreg noundef, i32 noundef signext, i64, i64 inreg noundef, i64 inreg noundef) -extern test_v4sf_2(v4sf, int, v4sf); +// N64: declare void @test_v4sf_2(i64 inreg noundef, i64 inreg noundef, i32 noundef signext, i64, i64 inreg noundef, i64 inreg noundef) +extern void test_v4sf_2(v4sf, int, v4sf); void test_v4sf(v4sf a1, int a2, v4sf a3) { test_v4sf_2(a3, a2, a1); } // O32: define{{.*}} void @test_v4i32(i32 inreg noundef %a1.coerce0, i32 inreg noundef %a1.coerce1, i32 inreg noundef %a1.coerce2, i32 inreg noundef %a1.coerce3, i32 noundef signext %a2, i32 %0, i32 inreg noundef %a3.coerce0, i32 inreg noundef %a3.coerce1, i32 inreg noundef %a3.coerce2, i32 inreg noundef %a3.coerce3) local_unnamed_addr [[NUW]] -// O32: declare i32 @test_v4i32_2(i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 noundef signext, i32, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef) +// O32: declare void @test_v4i32_2(i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 noundef signext, i32, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef, i32 inreg noundef) // N64: define{{.*}} void @test_v4i32(i64 inreg noundef %a1.coerce0, i64 inreg noundef %a1.coerce1, i32 noundef signext %a2, i64 %0, i64 inreg noundef %a3.coerce0, i64 inreg noundef %a3.coerce1) local_unnamed_addr [[NUW]] -// N64: declare signext i32 @test_v4i32_2(i64 inreg noundef, i64 inreg noundef, i32 noundef signext, i64, i64 inreg noundef, i64 inreg noundef) -extern test_v4i32_2(v4i32, int, v4i32); +// N64: declare void @test_v4i32_2(i64 inreg noundef, i64 inreg noundef, i32 noundef signext, i64, i64 inreg noundef, i64 inreg noundef) +extern void test_v4i32_2(v4i32, int, v4i32); void test_v4i32(v4i32 a1, int a2, v4i32 a3) { test_v4i32_2(a3, a2, a1); } diff --git a/clang/test/Driver/cxx_for_opencl.clcpp b/clang/test/Driver/cxx_for_opencl.clcpp index e3e89c5..fc2fc62 100644 --- a/clang/test/Driver/cxx_for_opencl.clcpp +++ b/clang/test/Driver/cxx_for_opencl.clcpp @@ -13,6 +13,6 @@ kernel void k(){ auto a = get_local_id(1); #ifndef __OPENCL_CPP_VERSION__ //expected-error@-2{{OpenCL C version 2.0 does not support the 'auto' storage class specifier}} -//expected-warning@-3{{type specifier missing, defaults to 'int'}} +//expected-error@-3{{type specifier missing, defaults to 'int'}} #endif } diff --git a/clang/test/FixIt/fixit.c b/clang/test/FixIt/fixit.c index 67bd947..eda00c35c 100644 --- a/clang/test/FixIt/fixit.c +++ b/clang/test/FixIt/fixit.c @@ -29,7 +29,7 @@ int array0[5] = { [3] 3 }; // expected-warning {{GNU 'missing ='}} // CHECK: int x // CHECK: int y -void f1(x, y) // expected-warning 2{{defaulting to type 'int'}} +void f1(x, y) // expected-error 2{{was not declared, defaults to 'int'; ISO C99 and later do not support implicit int}} { } @@ -50,7 +50,7 @@ int test_cond(int y, int fooBar) { // expected-note {{here}} const typedef typedef int int_t; // expected-warning {{duplicate 'typedef'}} // <rdar://problem/7159693> -enum Color { +enum Color { Red // expected-error{{missing ',' between enumerators}} Green = 17 // expected-error{{missing ',' between enumerators}} Blue, diff --git a/clang/test/Frontend/fixed_point_errors.c b/clang/test/Frontend/fixed_point_errors.c index 2d12a1e..6a71193 100644 --- a/clang/test/Frontend/fixed_point_errors.c +++ b/clang/test/Frontend/fixed_point_errors.c @@ -228,9 +228,9 @@ void CheckSuffixOnIntegerLiterals(void) { // Using auto auto auto_fract = 0r; // expected-error{{invalid suffix 'r' on integer constant}} - // expected-warning@-1{{type specifier missing, defaults to 'int'}} + // expected-error@-1{{type specifier missing, defaults to 'int'}} auto auto_accum = 0k; // expected-error{{invalid suffix 'k' on integer constant}} - // expected-warning@-1{{type specifier missing, defaults to 'int'}} + // expected-error@-1{{type specifier missing, defaults to 'int'}} } // Ok conversions diff --git a/clang/test/Frontend/fixed_point_not_enabled.c b/clang/test/Frontend/fixed_point_not_enabled.c index e752221..a1a60c5 100644 --- a/clang/test/Frontend/fixed_point_not_enabled.c +++ b/clang/test/Frontend/fixed_point_not_enabled.c @@ -11,7 +11,7 @@ unsigned long _Accum u_long_accum; // expected-error{{compile with '-ffixed-p // Aliased fixed point types short _Accum short_accum; // expected-error{{compile with '-ffixed-point' to enable fixed point types}} _Accum accum; // expected-error{{compile with '-ffixed-point' to enable fixed point types}} - // expected-warning@-1{{type specifier missing, defaults to 'int'}} + // expected-error@-1{{type specifier missing, defaults to 'int'}} long _Accum long_accum; // expected-error{{compile with '-ffixed-point' to enable fixed point types}} // Cannot use fixed point suffixes diff --git a/clang/test/Frontend/system-header-line-directive.c b/clang/test/Frontend/system-header-line-directive.c index 0de6919..d5705e0 100644 --- a/clang/test/Frontend/system-header-line-directive.c +++ b/clang/test/Frontend/system-header-line-directive.c @@ -3,7 +3,7 @@ #include <noline.h> #include <line-directive-in-system.h> -// expected-warning@line-directive.h:* {{type specifier missing, defaults to 'int'}} +// expected-error@line-directive.h:* {{type specifier missing, defaults to 'int'}} #include "line-directive.h" // This tests that "#line" directives in system headers preserve system diff --git a/clang/test/Index/reparsed-live-issue.cpp b/clang/test/Index/reparsed-live-issue.cpp index 56423de..9ff0359 100644 --- a/clang/test/Index/reparsed-live-issue.cpp +++ b/clang/test/Index/reparsed-live-issue.cpp @@ -1,4 +1,4 @@ // RUN: env CINDEXTEST_EDITING=1 LIBCLANG_DISABLE_CRASH_RECOVERY=1 c-index-test -test-load-source-reparse 2 none -remap-file-0=%S/Inputs/reparse-issue.h,%S/Inputs/reparse-issue.h-0 -remap-file-1=%S/Inputs/reparse-issue.h,%S/Inputs/reparse-issue.h-1 -- %s 2>&1 | FileCheck %s #include "Inputs/reparse-issue.h" -// CHECK: reparse-issue.h:4:1:{1:1-1:1}: error: C++ requires a type specifier for all declarations +// CHECK: reparse-issue.h:4:1:{1:1-1:1}: error: a type specifier is required for all declarations diff --git a/clang/test/Misc/warning-flags.c b/clang/test/Misc/warning-flags.c index a9e0a78..ac9a1f9 100644 --- a/clang/test/Misc/warning-flags.c +++ b/clang/test/Misc/warning-flags.c @@ -18,11 +18,10 @@ This test serves two purposes: The list of warnings below should NEVER grow. It should gradually shrink to 0. -CHECK: Warnings without flags (67): +CHECK: Warnings without flags (66): CHECK-NEXT: ext_expected_semi_decl_list CHECK-NEXT: ext_explicit_specialization_storage_class -CHECK-NEXT: ext_missing_declspec CHECK-NEXT: ext_missing_whitespace_after_macro_name CHECK-NEXT: ext_new_paren_array_nonconst CHECK-NEXT: ext_plain_complex @@ -90,4 +89,4 @@ CHECK-NEXT: warn_weak_import The list of warnings in -Wpedantic should NEVER grow. -CHECK: Number in -Wpedantic (not covered by other -W flags): 27 +CHECK: Number in -Wpedantic (not covered by other -W flags): 26 diff --git a/clang/test/Modules/malformed-overload.m b/clang/test/Modules/malformed-overload.m index 369de58..fd5d2f4 100644 --- a/clang/test/Modules/malformed-overload.m +++ b/clang/test/Modules/malformed-overload.m @@ -1,6 +1,6 @@ // RUN: rm -rf %t // RUN: %clang_cc1 -fsyntax-only -I%S/Inputs/malformed-overload -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Wno-strict-prototypes -verify %s -NSLog(@"%@", path); // expected-error {{expected parameter declarator}} expected-error {{expected ')'}} expected-warning {{type specifier missing}} expected-warning {{incompatible redeclaration}} expected-note {{to match this '('}} expected-note {{'NSLog' is a builtin with type}} +NSLog(@"%@", path); // expected-error {{expected parameter declarator}} expected-error {{expected ')'}} expected-error {{type specifier missing}} expected-warning {{incompatible redeclaration}} expected-note {{to match this '('}} expected-note {{'NSLog' is a builtin with type}} #import "X.h" @class NSString; diff --git a/clang/test/Modules/va_list.m b/clang/test/Modules/va_list.m index dd8f895..1de609a 100644 --- a/clang/test/Modules/va_list.m +++ b/clang/test/Modules/va_list.m @@ -1,24 +1,24 @@ // REQUIRES: x86-registered-target // RUN: rm -rf %t // RUN: %clang_cc1 -triple x86_64-apple-macosx10 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t \ -// RUN: -fmodules-ignore-macro=PREFIX -DPREFIX -I %S/Inputs/va_list \ +// RUN: -fmodules-ignore-macro=PREFIX -DPREFIX -Wno-error=implicit-int -I %S/Inputs/va_list \ // RUN: -x objective-c-header %s -o %t.pch -emit-pch // Include the pch, as a basic correctness check. // RUN: %clang_cc1 -triple x86_64-apple-macosx10 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t \ -// RUN: -fmodules-ignore-macro=PREFIX -I %S/Inputs/va_list -include-pch %t.pch \ +// RUN: -fmodules-ignore-macro=PREFIX -I %S/Inputs/va_list -Wno-error=implicit-int -include-pch %t.pch \ // RUN: -x objective-c %s -fsyntax-only // Repeat the previous emit-pch, but not we will have a global module index. // For some reason, this results in an identifier for __va_list_tag being // emitted into the pch. // RUN: %clang_cc1 -triple x86_64-apple-macosx10 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t \ -// RUN: -fmodules-ignore-macro=PREFIX -DPREFIX -I %S/Inputs/va_list \ +// RUN: -fmodules-ignore-macro=PREFIX -DPREFIX -I %S/Inputs/va_list -Wno-error=implicit-int \ // RUN: -x objective-c-header %s -o %t.pch -emit-pch // Include the pch, which now has __va_list_tag in it, which needs to be merged. // RUN: %clang_cc1 -triple x86_64-apple-macosx10 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t \ -// RUN: -fmodules-ignore-macro=PREFIX -I %S/Inputs/va_list -include-pch %t.pch \ +// RUN: -fmodules-ignore-macro=PREFIX -Wno-error=implicit-int -I %S/Inputs/va_list -include-pch %t.pch \ // RUN: -x objective-c %s -fsyntax-only // rdar://18039719 diff --git a/clang/test/PCH/decl-in-prototype.c b/clang/test/PCH/decl-in-prototype.c index 865775a..12dd960 100644 --- a/clang/test/PCH/decl-in-prototype.c +++ b/clang/test/PCH/decl-in-prototype.c @@ -14,7 +14,7 @@ #ifndef HEADER #define HEADER -static inline __attribute__((always_inline)) f(enum { x, y } p) { +static inline __attribute__((always_inline)) int f(enum { x, y } p) { return y; } diff --git a/clang/test/Parser/altivec.c b/clang/test/Parser/altivec.c index 3f344e9..66d2ca3 100644 --- a/clang/test/Parser/altivec.c +++ b/clang/test/Parser/altivec.c @@ -97,8 +97,8 @@ vector unsigned long int v_uli; // nonaix-warning {{Use of 'long' with '__ve // These should have warnings. __vector long double vv_ld; // expected-error {{cannot use 'long double' with '__vector'}} vector long double v_ld; // expected-error {{cannot use 'long double' with '__vector'}} -vector bool v_b; // expected-warning {{type specifier missing, defaults to 'int'}} -vector __bool v___b; // expected-warning {{type specifier missing, defaults to 'int'}} +vector bool v_b; // expected-error {{type specifier missing, defaults to 'int'}} +vector __bool v___b; // expected-error {{type specifier missing, defaults to 'int'}} // These should have errors. #ifndef __VSX__ diff --git a/clang/test/Parser/attributes.c b/clang/test/Parser/attributes.c index bc7f826..9f017c6 100644 --- a/clang/test/Parser/attributes.c +++ b/clang/test/Parser/attributes.c @@ -7,7 +7,7 @@ foo(void) { } -__attribute__(()) y; // expected-warning {{defaults to 'int'}} +__attribute__(()) y; // expected-error {{type specifier missing, defaults to 'int'}} // PR2796 int (__attribute__(()) *z)(long y); @@ -19,8 +19,8 @@ int f2(y, __attribute__(()) x); // expected-error {{expected identifier}} // This is parsed as a normal argument list (with two args that are implicit // int) because the __attribute__ is a declspec. -void f3(__attribute__(()) x, // expected-warning {{defaults to 'int'}} - y); // expected-warning {{defaults to 'int'}} +void f3(__attribute__(()) x, // expected-error {{type specifier missing, defaults to 'int'}} + y); // expected-error {{type specifier missing, defaults to 'int'}} void f4(__attribute__(())); // expected-error {{expected parameter declarator}} @@ -30,14 +30,14 @@ int baz(int (__attribute__(()) *x)(long y)); void g1(void (*f1)(__attribute__(()) int x)); void g2(int (*f2)(y, __attribute__(()) x)); // expected-error {{expected identifier}} -void g3(void (*f3)(__attribute__(()) x, int y)); // expected-warning {{defaults to 'int'}} +void g3(void (*f3)(__attribute__(()) x, int y)); // expected-error {{type specifier missing, defaults to 'int'}} void g4(void (*f4)(__attribute__(()))); // expected-error {{expected parameter declarator}} void (*h1)(void (*f1)(__attribute__(()) int x)); void (*h2)(int (*f2)(y, __attribute__(()) x)); // expected-error {{expected identifier}} -void (*h3)(void (*f3)(__attribute__(()) x)); // expected-warning {{defaults to 'int'}} +void (*h3)(void (*f3)(__attribute__(()) x)); // expected-error {{type specifier missing, defaults to 'int'}} void (*h4)(void (*f4)(__attribute__(()))); // expected-error {{expected parameter declarator}} diff --git a/clang/test/Parser/backtrack-off-by-one.cpp b/clang/test/Parser/backtrack-off-by-one.cpp index 52e1c41..b5c05aee 100644 --- a/clang/test/Parser/backtrack-off-by-one.cpp +++ b/clang/test/Parser/backtrack-off-by-one.cpp @@ -17,7 +17,7 @@ template <typename T> class B : T // not ',' or '{' // expected-error@+8 {{expected ';' after top level declarator}} #endif #if __cplusplus <= 201402L -// expected-error@+5 {{C++ requires a type specifier for all declarations}} +// expected-error@+5 {{a type specifier is required for all declarations}} #else // expected-error@+3 {{expected unqualified-id}} #endif diff --git a/clang/test/Parser/c2x-attributes.c b/clang/test/Parser/c2x-attributes.c index cffc6cd..e1265f7 100644 --- a/clang/test/Parser/c2x-attributes.c +++ b/clang/test/Parser/c2x-attributes.c @@ -60,7 +60,8 @@ void f4(void) [[]]; void f5(int i [[]], [[]] int j, int [[]] k); void f6(a, b) [[]] int a; int b; { // notc2x-error {{an attribute list cannot appear here}} \ - c2x-warning 2 {{type specifier missing, defaults to 'int'}} \ + c2x-error {{unknown type name 'a'}} \ + c2x-error {{unknown type name 'b'}} \ c2x-error {{expected ';' after top level declarator}} \ c2x-error {{expected identifier or '('}} } @@ -70,7 +71,8 @@ void f6(a, b) [[]] int a; int b; { // notc2x-error {{an attribute list cannot ap // behavior given that we *don't* want to parse it as part of the K&R parameter // declarations. It is disallowed to avoid a parsing ambiguity we already // handle well. -int (*f7(a, b))(int, int) [[]] int a; int b; { // c2x-warning 2 {{type specifier missing, defaults to 'int'}} \ +int (*f7(a, b))(int, int) [[]] int a; int b; { // c2x-error {{unknown type name 'a'}} \ + c2x-error {{unknown type name 'b'}} \ c2x-error {{expected ';' after top level declarator}} \ c2x-error {{expected identifier or '('}} diff --git a/clang/test/Parser/c2x-func-prototype.c b/clang/test/Parser/c2x-func-prototype.c index ff51945..2602fa8 100644 --- a/clang/test/Parser/c2x-func-prototype.c +++ b/clang/test/Parser/c2x-func-prototype.c @@ -4,7 +4,7 @@ // Functions with an identifier list are not supported in C2x. void ident_list(a) // c2x-error {{expected ';' after top level declarator}} \ - c2x-warning {{type specifier missing, defaults to 'int'}} + c2x-error {{unknown type name 'a'}} int a; {} // c2x-error {{expected identifier or '('}} diff --git a/clang/test/Parser/colon-colon-parentheses.cpp b/clang/test/Parser/colon-colon-parentheses.cpp index 804e4f7..b8e203c 100644 --- a/clang/test/Parser/colon-colon-parentheses.cpp +++ b/clang/test/Parser/colon-colon-parentheses.cpp @@ -24,7 +24,7 @@ void foo() { // The following tests used to be crash bugs. // PR21815 -// expected-error@+2{{C++ requires a type specifier for all declarations}} +// expected-error@+2{{a type specifier is required for all declarations}} // expected-error@+1{{expected unqualified-id}} a (::( )); diff --git a/clang/test/Parser/cxx-altivec.cpp b/clang/test/Parser/cxx-altivec.cpp index 5b04e23..11ac15e 100644 --- a/clang/test/Parser/cxx-altivec.cpp +++ b/clang/test/Parser/cxx-altivec.cpp @@ -112,7 +112,8 @@ vector __bool long long v_bll4; // expected-error {{use of 'long long' with #endif __vector long double vv_ld3; // expected-error {{cannot use 'long double' with '__vector'}} vector long double v_ld4; // expected-error {{cannot use 'long double' with '__vector'}} -vector bool v_b; // expected-error {{C++ requires a type specifier for all declarations}} +// FIXME: why is this diagnostic different from the others? +vector bool v_b; // expected-error {{a type specifier is required for all declarations}} vector bool float v_bf; // expected-error {{cannot use 'float' with '__vector bool'}} vector bool double v_bd; // expected-error {{cannot use 'double' with '__vector bool'}} vector bool pixel v_bp; // expected-error {{cannot use '__pixel' with '__vector bool'}} diff --git a/clang/test/Parser/cxx-concepts-ambig-constraint-expr.cpp b/clang/test/Parser/cxx-concepts-ambig-constraint-expr.cpp index f85cfce..4dcd993 100644 --- a/clang/test/Parser/cxx-concepts-ambig-constraint-expr.cpp +++ b/clang/test/Parser/cxx-concepts-ambig-constraint-expr.cpp @@ -6,4 +6,4 @@ // type-specifier-seq in conversion-type-id template <typename T> requires T::operator short -unsigned int foo(); // expected-error {{C++ requires a type specifier for all declarations}}
\ No newline at end of file +unsigned int foo(); // expected-error {{a type specifier is required for all declarations}}
\ No newline at end of file diff --git a/clang/test/Parser/cxx-decl.cpp b/clang/test/Parser/cxx-decl.cpp index dbf3a3e..725141d 100644 --- a/clang/test/Parser/cxx-decl.cpp +++ b/clang/test/Parser/cxx-decl.cpp @@ -30,7 +30,7 @@ y::a a3 = a2; void foo() { y: // label y::a s; - + int a = 4; a = a ? a : a+1; } @@ -39,7 +39,7 @@ struct b : y::a {}; template <typename T> class someclass { - + int bar() { T *P; return 1 ? P->x : P->y; @@ -62,7 +62,7 @@ struct a { void test(struct Type *P) { int Type; Type = 1 ? P->Type : Type; - + Type = (y:b) 4; // expected-error {{unexpected ':' in nested name specifier}} Type = 1 ? ( (y:b) // expected-error {{unexpected ':' in nested name specifier}} @@ -128,7 +128,7 @@ struct CodeCompleteConsumer { }; void CodeCompleteConsumer::() { // expected-error {{xpected unqualified-id}} -} +} ; @@ -306,14 +306,14 @@ namespace rdar37099386 { // PR8380 extern "" // expected-error {{unknown linkage language}} -test6a { ;// expected-error {{C++ requires a type specifier for all declarations}} +test6a { ;// expected-error {{a type specifier is required for all declarations}} #if __cplusplus <= 199711L // expected-error@-2 {{expected ';' after top level declarator}} #else // expected-error@-4 {{expected expression}} // expected-note@-5 {{to match this}} #endif - + int test6b; #if __cplusplus >= 201103L // expected-error@+3 {{expected}} diff --git a/clang/test/Parser/cxx-keyword-identifiers.cpp b/clang/test/Parser/cxx-keyword-identifiers.cpp index 2c6f18e..471a21a 100644 --- a/clang/test/Parser/cxx-keyword-identifiers.cpp +++ b/clang/test/Parser/cxx-keyword-identifiers.cpp @@ -26,6 +26,6 @@ void test() { }; } struct Foo { - void bar(*decltype(1) aux); // expected-error {{C++ requires a type specifier for all declarations}}. \ + void bar(*decltype(1) aux); // expected-error {{a type specifier is required for all declarations}}. \ // expected-error {{expected ')'}} expected-note {{to match this '('}} }; diff --git a/clang/test/Parser/cxx-template-decl.cpp b/clang/test/Parser/cxx-template-decl.cpp index 26f6ce2..55c71b4 100644 --- a/clang/test/Parser/cxx-template-decl.cpp +++ b/clang/test/Parser/cxx-template-decl.cpp @@ -6,7 +6,7 @@ // Errors export class foo { }; // expected-error {{expected template}} -template x; // expected-error {{C++ requires a type specifier for all declarations}} \ +template x; // expected-error {{a type specifier is required for all declarations}} \ // expected-error {{does not refer}} export template x; // expected-error {{expected '<' after 'template'}} export template<class T> class x0; // expected-warning {{exported templates are unsupported}} @@ -62,7 +62,7 @@ template <int> class NTP0; template <int N> class NTP1; template <int N = 5> class NTP2; template <int = 10> class NTP3; -template <unsigned int N = 12u> class NTP4; +template <unsigned int N = 12u> class NTP4; template <unsigned int = 12u> class NTP5; template <unsigned = 15u> class NTP6; template <typename T, T Obj> class NTP7; @@ -111,11 +111,11 @@ template<template<typename> class T> struct shadow8 { // expected-note{{template }; // Non-type template parameters in scope -template<int Size> +template<int Size> void f(int& i) { i = Size; #ifdef DELAYED_TEMPLATE_PARSING - Size = i; + Size = i; #else Size = i; // expected-error{{expression is not assignable}} #endif @@ -144,7 +144,7 @@ namespace PR6184 { template <typename T> void bar(typename T::x); } - + template <typename T> void N::bar(typename T::x) { } } @@ -198,7 +198,7 @@ struct L { struct O { template <typename U> static oneT Fun(U); - + }; }; template <int k> @@ -212,8 +212,8 @@ template<typename U> oneT L<0>::O<char>::Fun(U) { return one; } -void Instantiate() { - sassert(sizeof(L<0>::O<int>::Fun(0)) == sizeof(one)); +void Instantiate() { + sassert(sizeof(L<0>::O<int>::Fun(0)) == sizeof(one)); sassert(sizeof(L<0>::O<char>::Fun(0)) == sizeof(one)); } diff --git a/clang/test/Parser/cxx-undeclared-identifier.cpp b/clang/test/Parser/cxx-undeclared-identifier.cpp index a3f9e02..c5bf8ae 100644 --- a/clang/test/Parser/cxx-undeclared-identifier.cpp +++ b/clang/test/Parser/cxx-undeclared-identifier.cpp @@ -1,15 +1,15 @@ // RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s namespace ImplicitInt { - static a(4); // expected-error {{requires a type specifier}} - b(int n); // expected-error {{requires a type specifier}} + static a(4); // expected-error {{a type specifier is required}} + b(int n); // expected-error {{a type specifier is required}} c (*p)[]; // expected-error {{unknown type name 'c'}} - itn f(char *p, *q); // expected-error {{unknown type name 'itn'}} expected-error {{requires a type specifier}} + itn f(char *p, *q); // expected-error {{unknown type name 'itn'}} expected-error {{a type specifier is required}} struct S { void f(); }; - S::f() {} // expected-error {{requires a type specifier}} + S::f() {} // expected-error {{a type specifier is required}} } // PR7180 diff --git a/clang/test/Parser/cxx2b-lambdas.cpp b/clang/test/Parser/cxx2b-lambdas.cpp index 57e81eed..19e9bf0 100644 --- a/clang/test/Parser/cxx2b-lambdas.cpp +++ b/clang/test/Parser/cxx2b-lambdas.cpp @@ -28,7 +28,7 @@ auto XL1 = [] constexpr mutable constexpr {}; // expected-error{{cannot appear auto XL2 = []) constexpr mutable constexpr {}; // expected-error{{expected body of lambda expression}} auto XL3 = []( constexpr mutable constexpr {}; // expected-error{{invalid storage class specifier}} \ // expected-error{{function parameter cannot be constexpr}} \ - // expected-error{{C++ requires}} \ + // expected-error{{a type specifier is required}} \ // expected-error{{expected ')'}} \ // expected-note{{to match this '('}} \ // expected-error{{expected body}} \ diff --git a/clang/test/Parser/declarators.c b/clang/test/Parser/declarators.c index 0faedca..c309cad 100644 --- a/clang/test/Parser/declarators.c +++ b/clang/test/Parser/declarators.c @@ -6,7 +6,7 @@ void f0(); /* expected-warning {{a function declaration without a prototype is d void f1(int [*]); void f2(int [const *]); void f3(int [volatile const*]); -int f4(*XX)(void); /* expected-error {{cannot return}} expected-warning {{type specifier missing, defaults to 'int'}} */ +int f4(*XX)(void); /* expected-error {{cannot return}} expected-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} */ int f5(int [static]); /* expected-error {{'static' may not be used without an array size}} */ char ((((*X)))); @@ -64,9 +64,9 @@ struct xyz test8(void) { return a; } // a should be be marked invalid, no diag. // Verify that implicit int still works. -static f; // expected-warning {{type specifier missing, defaults to 'int'}} -static g = 4; // expected-warning {{type specifier missing, defaults to 'int'}} -static h // expected-warning {{type specifier missing, defaults to 'int'}} +static f; // expected-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} +static g = 4; // expected-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} +static h // expected-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} __asm__("foo"); diff --git a/clang/test/Parser/explicit-bool.cpp b/clang/test/Parser/explicit-bool.cpp index aa700bc..b1dd221 100644 --- a/clang/test/Parser/explicit-bool.cpp +++ b/clang/test/Parser/explicit-bool.cpp @@ -54,7 +54,7 @@ struct B { // cxx20-warning@#4 {{incompatible with C++ standards before C++20}} explicit (operator+(A())) operator int(); // #5 - // cxx17-error@#5 {{requires a type specifier}} cxx17-error@#5 {{expected ';'}} + // cxx17-error@#5 {{a type specifier is required}} cxx17-error@#5 {{expected ';'}} // cxx17-warning@#5 {{will be parsed as explicit(bool)}} // cxx20-warning@#5 {{incompatible with C++ standards before C++20}} }; diff --git a/clang/test/Parser/ext-int.cpp b/clang/test/Parser/ext-int.cpp index e709493..e013294 100644 --- a/clang/test/Parser/ext-int.cpp +++ b/clang/test/Parser/ext-int.cpp @@ -4,12 +4,12 @@ // expected-note@+4{{to match this '('}} // expected-error@+3{{expected unqualified-id}} // expected-error@+2{{extraneous closing brace}} -// expected-error@+1{{C++ requires a type specifier for all declarations}} +// expected-error@+1{{a type specifier is required for all declarations}} _BitInt(32} a; // expected-error@+2{{expected expression}} -// expected-error@+1{{C++ requires a type specifier for all declarations}} +// expected-error@+1{{a type specifier is required for all declarations}} _BitInt(32* ) b; // expected-error@+3{{expected '('}} // expected-error@+2{{expected unqualified-id}} -// expected-error@+1{{C++ requires a type specifier for all declarations}} +// expected-error@+1{{a type specifier is required for all declarations}} _BitInt{32} c; diff --git a/clang/test/Parser/objc-forcollection-neg-2.m b/clang/test/Parser/objc-forcollection-neg-2.m index f95dd13..e28b74f 100644 --- a/clang/test/Parser/objc-forcollection-neg-2.m +++ b/clang/test/Parser/objc-forcollection-neg-2.m @@ -24,7 +24,7 @@ typedef struct objc_object { @implementation MyList (BasicTest) - (void)compilerTestAgainst { - static i;// expected-warning {{type specifier missing, defaults to 'int'}} + static i;// expected-error {{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/clang/test/Parser/static_assert.c b/clang/test/Parser/static_assert.c index 452c404a..c57e3b0 100644 --- a/clang/test/Parser/static_assert.c +++ b/clang/test/Parser/static_assert.c @@ -18,7 +18,7 @@ static_assert(1, ""); // c2x-error {{expected parameter declarator}} \ // c2x-error {{expected ')'}} \ // c2x-note {{to match this '('}} \ - // c2x-warning {{type specifier missing, defaults to 'int'}} \ + // c2x-error {{a type specifier is required for all declarations}} \ // c2x-ms-warning {{use of 'static_assert' without inclusion of <assert.h> is a Microsoft extension}} #endif diff --git a/clang/test/Preprocessor/macro_paste_msextensions.c b/clang/test/Preprocessor/macro_paste_msextensions.c index dcc5336..1549ff5 100644 --- a/clang/test/Preprocessor/macro_paste_msextensions.c +++ b/clang/test/Preprocessor/macro_paste_msextensions.c @@ -32,7 +32,7 @@ nested(baz) rise of the dead tokens // rdar://8197149 - VC++ allows invalid token pastes: (##baz #define foo(x) abc(x) #define bar(y) foo(##baz(y)) -bar(q) // expected-warning {{type specifier missing}} expected-error {{invalid preprocessing token}} expected-error {{parameter list without types}} +bar(q) // expected-error {{type specifier missing}} expected-error {{invalid preprocessing token}} expected-error {{parameter list without types}} // CHECK: abc(baz(q)) diff --git a/clang/test/Sema/address_spaces.c b/clang/test/Sema/address_spaces.c index 085bef9..ff7a134 100644 --- a/clang/test/Sema/address_spaces.c +++ b/clang/test/Sema/address_spaces.c @@ -9,7 +9,7 @@ void bar(_AS2 int a); // expected-error {{parameter may not be qualified with an void foo(_AS3 float *a, _AS1 float b) // expected-error {{parameter may not be qualified with an address space}} { - _AS2 *x;// expected-warning {{type specifier missing, defaults to 'int'}} + _AS2 *x;// expected-error {{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/clang/test/Sema/auto-type.c b/clang/test/Sema/auto-type.c index 7faa8a6..4e85eec 100644 --- a/clang/test/Sema/auto-type.c +++ b/clang/test/Sema/auto-type.c @@ -37,7 +37,7 @@ void Issue53652(void) { // GCC does not accept this either, for the same reason. _Atomic(__auto_type) aat2 = a; // expected-error {{'__auto_type' not allowed here}} \ - // expected-warning {{type specifier missing, defaults to 'int'}} + // expected-error {{type specifier missing, defaults to 'int'}} // Ensure the types are what we expect them to be, regardless of order we // pass the types. diff --git a/clang/test/Sema/block-args.c b/clang/test/Sema/block-args.c index 245b2c0..1e000ab 100644 --- a/clang/test/Sema/block-args.c +++ b/clang/test/Sema/block-args.c @@ -37,7 +37,7 @@ void f0(void) { // rdar://problem/8962770 void test4(void) { - int (^f)(void) = ^((x)) { }; // expected-warning {{type specifier missing}} expected-error {{type-id cannot have a name}} + int (^f)(void) = ^((x)) { }; // expected-error {{type specifier missing}} expected-error {{type-id cannot have a name}} } // rdar://problem/9170609 diff --git a/clang/test/Sema/block-literal.c b/clang/test/Sema/block-literal.c index d1607ce..b760c64 100644 --- a/clang/test/Sema/block-literal.c +++ b/clang/test/Sema/block-literal.c @@ -29,7 +29,7 @@ void test2(void) { takeblock(^{ printf("%d\n", x); }); while (1) { - takeblock(^{ + takeblock(^{ break; // expected-error {{'break' statement not in loop or switch statement}} continue; // expected-error {{'continue' statement not in loop statement}} while(1) break; // ok @@ -41,12 +41,12 @@ void test2(void) { foo: takeblock(^{ x = 4; }); // expected-error {{variable is not assignable (missing __block type specifier)}} - __block y = 7; // expected-warning {{type specifier missing, defaults to 'int'}} + __block y = 7; // expected-error {{type specifier missing, defaults to 'int'}} takeblock(^{ y = 8; }); } -void (^test3(void))(void) { +void (^test3(void))(void) { return ^{}; } @@ -86,4 +86,4 @@ typedef void (^void_block_t)(void); static const void_block_t myBlock = ^{ }; -static const void_block_t myBlock2 = ^ void(void) { }; +static const void_block_t myBlock2 = ^ void(void) { }; diff --git a/clang/test/Sema/c89.c b/clang/test/Sema/c89.c index 210574c..0bbd14e 100644 --- a/clang/test/Sema/c89.c +++ b/clang/test/Sema/c89.c @@ -39,20 +39,16 @@ int *__restrict; /* expected-error {{expected identifier}} */ test6(void) { return 0; } /* PR2012 */ -test7; /* expected-warning {{declaration specifier missing, defaulting to 'int'}} */ +test7; -void test8(int, x); /* expected-warning {{declaration specifier missing, defaulting to 'int'}} */ +void test8(int, x); typedef int sometype; -int a(sometype, y) {return 0;} /* expected-warning {{declaration specifier missing, defaulting to 'int'}} \ - expected-warning {{omitting the parameter name in a function definition is a C2x extension}}*/ +int a(sometype, y) {return 0;} /* expected-warning {{omitting the parameter name in a function definition is a C2x extension}}*/ - - - -void bar (void *); +void bar (void *); void f11 (z) /* expected-error {{may not have 'void' type}} */ -void z; +void z; { bar (&z); } typedef void T; diff --git a/clang/test/Sema/crash-invalid-builtin.c b/clang/test/Sema/crash-invalid-builtin.c index 8f749f7..26e5888 100644 --- a/clang/test/Sema/crash-invalid-builtin.c +++ b/clang/test/Sema/crash-invalid-builtin.c @@ -1,4 +1,4 @@ // RUN: %clang_cc1 -triple=x86_64-apple-darwin -fsyntax-only -verify %s // PR23086 -__builtin_isinf(...); // expected-warning {{type specifier missing, defaults to 'int'}} expected-error {{ISO C requires a named parameter before '...'}} // expected-error {{cannot redeclare builtin function '__builtin_isinf'}} // expected-note {{'__builtin_isinf' is a builtin with type 'int ()'}} +__builtin_isinf(...); // expected-error {{type specifier missing, defaults to 'int'}} expected-error {{ISO C requires a named parameter before '...'}} // expected-error {{cannot redeclare builtin function '__builtin_isinf'}} // expected-note {{'__builtin_isinf' is a builtin with type 'int ()'}} diff --git a/clang/test/Sema/darwin-tls.c b/clang/test/Sema/darwin-tls.c index 6279e0b..9a41c5c 100644 --- a/clang/test/Sema/darwin-tls.c +++ b/clang/test/Sema/darwin-tls.c @@ -1,18 +1,18 @@ // RUN: not %clang_cc1 -fsyntax-only -triple x86_64-apple-macosx10.6 %s 2>&1 | FileCheck %s --check-prefix NO-TLS -// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-macosx10.7 %s 2>&1 | FileCheck %s --check-prefix TLS +// RUN: %clang_cc1 -fsyntax-only -Wno-error=implicit-int -triple x86_64-apple-macosx10.7 %s 2>&1 | FileCheck %s --check-prefix TLS // RUN: not %clang_cc1 -fsyntax-only -triple arm64-apple-ios7.1 %s 2>&1 | FileCheck %s --check-prefix NO-TLS -// RUN: %clang_cc1 -fsyntax-only -triple arm64-apple-ios8.0 %s 2>&1 | FileCheck %s --check-prefix TLS +// RUN: %clang_cc1 -fsyntax-only -Wno-error=implicit-int -triple arm64-apple-ios8.0 %s 2>&1 | FileCheck %s --check-prefix TLS // RUN: not %clang_cc1 -fsyntax-only -triple thumbv7s-apple-ios8.3 %s 2>&1 | FileCheck %s --check-prefix NO-TLS -// RUN: %clang_cc1 -fsyntax-only -triple thumbv7s-apple-ios9.0 %s 2>&1 | FileCheck %s --check-prefix TLS -// RUN: %clang_cc1 -fsyntax-only -triple armv7-apple-ios9.0 %s 2>&1 | FileCheck %s --check-prefix TLS +// RUN: %clang_cc1 -fsyntax-only -Wno-error=implicit-int -triple thumbv7s-apple-ios9.0 %s 2>&1 | FileCheck %s --check-prefix TLS +// RUN: %clang_cc1 -fsyntax-only -Wno-error=implicit-int -triple armv7-apple-ios9.0 %s 2>&1 | FileCheck %s --check-prefix TLS // RUN: not %clang_cc1 -fsyntax-only -triple i386-apple-ios9.0-simulator %s 2>&1 | FileCheck %s --check-prefix NO-TLS -// RUN: %clang_cc1 -fsyntax-only -triple i386-apple-ios10.0-simulator %s 2>&1 | FileCheck %s --check-prefix TLS +// RUN: %clang_cc1 -fsyntax-only -Wno-error=implicit-int -triple i386-apple-ios10.0-simulator %s 2>&1 | FileCheck %s --check-prefix TLS // RUN: not %clang_cc1 -fsyntax-only -triple thumbv7k-apple-watchos1.0 %s 2>&1 | FileCheck %s --check-prefix NO-TLS -// RUN: %clang_cc1 -fsyntax-only -triple thumbv7k-apple-watchos2.0 %s 2>&1 | FileCheck %s --check-prefix TLS +// RUN: %clang_cc1 -fsyntax-only -Wno-error=implicit-int -triple thumbv7k-apple-watchos2.0 %s 2>&1 | FileCheck %s --check-prefix TLS // RUN: not %clang_cc1 -fsyntax-only -triple i386-apple-watchos2.0-simulator %s 2>&1 | FileCheck %s --check-prefix NO-TLS -// RUN: %clang_cc1 -fsyntax-only -triple i386-apple-watchos3.0-simulator %s 2>&1 | FileCheck %s --check-prefix TLS +// RUN: %clang_cc1 -fsyntax-only -Wno-error=implicit-int -triple i386-apple-watchos3.0-simulator %s 2>&1 | FileCheck %s --check-prefix TLS __thread int a; diff --git a/clang/test/Sema/function.c b/clang/test/Sema/function.c index 3140bfb..b4ecc54 100644 --- a/clang/test/Sema/function.c +++ b/clang/test/Sema/function.c @@ -18,7 +18,7 @@ void h (const char *fmt, ...) {} // expected-error{{conflicting types for 'h'}} // PR1965 int t5(b); // expected-error {{parameter list without types}} -int t6(int x, g); // expected-warning {{type specifier missing, defaults to 'int'}} +int t6(int x, g); // expected-error {{type specifier missing, defaults to 'int'}} int t7(, ); // expected-error {{expected parameter declarator}} expected-error {{expected parameter declarator}} int t8(, int a); // expected-error {{expected parameter declarator}} @@ -41,8 +41,8 @@ int t14() { } // <rdar://problem/6097326> -y(y) { return y; } // expected-warning{{parameter 'y' was not declared, defaulting to type 'int'}} \ - // expected-warning{{type specifier missing, defaults to 'int'}} +y(y) { return y; } // expected-error{{parameter 'y' was not declared, defaults to 'int'; ISO C99 and later do not support implicit int}} \ + // expected-error{{type specifier missing, defaults to 'int'}} // PR3137, <rdar://problem/6127293> diff --git a/clang/test/Sema/implicit-int.c b/clang/test/Sema/implicit-int.c index 361f0d3..477cd69 100644 --- a/clang/test/Sema/implicit-int.c +++ b/clang/test/Sema/implicit-int.c @@ -1,16 +1,24 @@ -// RUN: %clang_cc1 -fsyntax-only %s -verify -pedantic -Wno-strict-prototypes - -foo(void) { // expected-warning {{type specifier missing, defaults to 'int'}} +/* RUN: %clang_cc1 -fsyntax-only -std=c89 -Wimplicit-int %s -verify -Wno-strict-prototypes + RUN: %clang_cc1 -fsyntax-only -std=c99 %s -verify=ext -Wno-strict-prototypes + RUN: %clang_cc1 -fsyntax-only -std=c2x %s -verify=unsupported +*/ + +foo(void) { /* expected-warning {{type specifier missing, defaults to 'int'}} \ + ext-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} \ + unsupported-error {{a type specifier is required for all declarations}} */ return 0; } -y; // expected-warning {{type specifier missing, defaults to 'int'}} - -// rdar://6131634 -void f((x)); // expected-warning {{type specifier missing, defaults to 'int'}} +y; /* expected-warning {{type specifier missing, defaults to 'int'}} \ + ext-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} \ + unsupported-error {{a type specifier is required for all declarations}} */ +/* rdar://6131634 */ +void f((x)); /* expected-warning {{type specifier missing, defaults to 'int'}} \ + ext-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} \ + unsupported-error {{a type specifier is required for all declarations}} */ -// PR3702 +/* PR3702 */ #define PAD(ms10) { \ register i; \ } @@ -18,11 +26,18 @@ void f((x)); // expected-warning {{type specifier missing, defaults to 'int'}} #define ILPAD() PAD((NROW - tt.tt_row) * 10) /* 1 ms per char */ void -h19_insline(n) // expected-warning {{parameter 'n' was not declared, defaulting to type 'int'}} +h19_insline(n) /* ext-error {{parameter 'n' was not declared, defaults to 'int'; ISO C99 and later do not support implicit int}} \ + unsupported-error {{unknown type name 'n'}} */ { - ILPAD(); // expected-warning {{type specifier missing, defaults to 'int'}} + ILPAD(); /* expected-warning {{type specifier missing, defaults to 'int'}} \ + ext-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} \ + unsupported-error {{a type specifier is required for all declarations}} */ + } struct foo { - __extension__ __attribute__((packed)) x : 4; // expected-warning {{type specifier missing, defaults to 'int'}} + __extension__ __attribute__((packed)) x : 4; /* expected-warning {{type specifier missing, defaults to 'int'}} \ + ext-error {{type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int}} \ + unsupported-error {{unknown type name 'x'}} */ + }; diff --git a/clang/test/Sema/invalid-decl.c b/clang/test/Sema/invalid-decl.c index 08da9bc..4f26800 100644 --- a/clang/test/Sema/invalid-decl.c +++ b/clang/test/Sema/invalid-decl.c @@ -6,7 +6,7 @@ void test(void) { // PR2400 -typedef xtype (*x)(void* handle); // expected-error {{function cannot return function type}} expected-warning {{type specifier missing, defaults to 'int'}} expected-warning {{type specifier missing, defaults to 'int'}} +typedef xtype (*x)(void* handle); // expected-error {{function cannot return function type}} expected-error 2{{type specifier missing, defaults to 'int'}} typedef void ytype(); diff --git a/clang/test/Sema/invalid-struct-init.c b/clang/test/Sema/invalid-struct-init.c index 000d3ab..72f6bba 100644 --- a/clang/test/Sema/invalid-struct-init.c +++ b/clang/test/Sema/invalid-struct-init.c @@ -3,8 +3,8 @@ typedef struct _zend_module_entry zend_module_entry; struct _zend_module_entry { _efree((p)); // expected-error{{type name requires a specifier or qualifier}} \ - expected-warning {{type specifier missing, defaults to 'int'}} - + expected-error {{type specifier missing, defaults to 'int'}} + }; typedef struct _zend_function_entry { } zend_function_entry; typedef struct _zend_pcre_globals { } zend_pcre_globals; @@ -18,10 +18,10 @@ static int zm_startup_pcre(int type, int module_number ) { } static int zm_shutdown_pcre(int type, int module_number ) { zend_function_entry pcre_functions[] = {{ }; // expected-error{{expected '}'}} expected-note {{to match this '{'}} zend_module_entry pcre_module_entry = { - sizeof(zend_module_entry), 20071006, 0, 0, ((void *)0), ((void *)0), - "pcre", pcre_functions, zm_startup_pcre, zm_shutdown_pcre, ((void *)0), - ((void *)0), zm_info_pcre, ((void *)0), sizeof(zend_pcre_globals), &pcre_globals, - ((void (*)(void* ))(zm_globals_ctor_pcre)), ((void (*)(void* ))(zm_globals_dtor_pcre)), - ((void *)0), 0, 0, ((void *)0), 0 + sizeof(zend_module_entry), 20071006, 0, 0, ((void *)0), ((void *)0), + "pcre", pcre_functions, zm_startup_pcre, zm_shutdown_pcre, ((void *)0), + ((void *)0), zm_info_pcre, ((void *)0), sizeof(zend_pcre_globals), &pcre_globals, + ((void (*)(void* ))(zm_globals_ctor_pcre)), ((void (*)(void* ))(zm_globals_dtor_pcre)), + ((void *)0), 0, 0, ((void *)0), 0 }; } diff --git a/clang/test/Sema/redefinition.c b/clang/test/Sema/redefinition.c index a165563..7e690e1 100644 --- a/clang/test/Sema/redefinition.c +++ b/clang/test/Sema/redefinition.c @@ -4,7 +4,7 @@ int f(int); int f(int a) { return 0; } // expected-error {{redefinition of 'f'}} // <rdar://problem/6097326> -int foo(x) { +int foo(x) { // expected-error {{parameter 'x' was not declared, defaults to 'int'; ISO C99 and later do not support implicit int}} return 0; } int x = 1; diff --git a/clang/test/Sema/return.c b/clang/test/Sema/return.c index fc7d711..14d5300 100644 --- a/clang/test/Sema/return.c +++ b/clang/test/Sema/return.c @@ -1,7 +1,7 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -fsyntax-only -Wignored-qualifiers -Wno-error=return-type -verify -fblocks -Wno-unreachable-code -Wno-unused-value -Wno-strict-prototypes +// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -fsyntax-only -Wignored-qualifiers -Wno-error=return-type -Wno-error=implicit-int -verify -fblocks -Wno-unreachable-code -Wno-unused-value -Wno-strict-prototypes // clang emits the following warning by default. -// With GCC, -pedantic, -Wreturn-type or -Wall are required to produce the +// With GCC, -pedantic, -Wreturn-type or -Wall are required to produce the // following warning. int t14(void) { return; // expected-warning {{non-void function 't14' should return a value}} @@ -173,7 +173,7 @@ int test27(void) { goto done; } return 1; - case 4: + case 4: while (0) { goto done; } return 1; case 5: @@ -190,7 +190,7 @@ int test27(void) { // PR4624 void test28() __attribute__((noreturn)); -void test28(x) { while (1) { } } +void test28(x) { while (1) { } } // expected-warning {{parameter 'x' was not declared, defaults to 'int'; ISO C99 and later do not support implicit int}} void exit(int); int test29(void) { diff --git a/clang/test/Sema/typo-correction.c b/clang/test/Sema/typo-correction.c index d69a2eb..ceab0e2 100644 --- a/clang/test/Sema/typo-correction.c +++ b/clang/test/Sema/typo-correction.c @@ -10,11 +10,11 @@ void PR21656(void) { x = (float)arst; // expected-error-re {{use of undeclared identifier 'arst'{{$}}}} } -a = b ? : 0; // expected-warning {{type specifier missing, defaults to 'int'}} \ +a = b ? : 0; // expected-error {{type specifier missing, defaults to 'int'}} \ // expected-error {{use of undeclared identifier 'b'}} int foobar; // expected-note {{'foobar' declared here}} -new_a = goobar ?: 4; // expected-warning {{type specifier missing, defaults to 'int'}} \ +new_a = goobar ?: 4; // expected-error {{type specifier missing, defaults to 'int'}} \ // expected-error {{use of undeclared identifier 'goobar'; did you mean 'foobar'?}} \ // expected-error {{initializer element is not a compile-time constant}} diff --git a/clang/test/Sema/warn-strict-prototypes.c b/clang/test/Sema/warn-strict-prototypes.c index c4cdf8e..c16073d0 100644 --- a/clang/test/Sema/warn-strict-prototypes.c +++ b/clang/test/Sema/warn-strict-prototypes.c @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -triple i386-pc-unknown -fsyntax-only -Wstrict-prototypes -Wno-implicit-function-declaration -verify %s -// RUN: %clang_cc1 -triple i386-pc-unknown -fsyntax-only -Wstrict-prototypes -Wno-implicit-function-declaration -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple i386-pc-unknown -fsyntax-only -Wstrict-prototypes -Wno-implicit-function-declaration -Wno-error=implicit-int -verify %s +// RUN: %clang_cc1 -triple i386-pc-unknown -fsyntax-only -Wstrict-prototypes -Wno-implicit-function-declaration -Wno-error=implicit-int -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s // function definition with 0 params, no prototype, no preceding declaration. void foo0() {} // expected-warning {{a function declaration without a prototype is deprecated in all versions of C}} @@ -59,7 +59,8 @@ void foo10(); // expected-warning {{a function declaration without a prototype i expected-note {{a function declaration without a prototype is not supported in C2x}} // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"void" // K&R function definition with incomplete param list declared -void foo10(p, p2) void *p; {} // expected-warning {{a function declaration without a prototype is deprecated in all versions of C and is not supported in C2x}} +void foo10(p, p2) void *p; {} // expected-warning {{a function declaration without a prototype is deprecated in all versions of C and is not supported in C2x}} \ + expected-warning {{parameter 'p2' was not declared, defaults to 'int'; ISO C99 and later do not support implicit int}} void foo11(int p, int p2); void foo11(p, p2) int p; int p2; {} // expected-warning {{a function declaration without a prototype is deprecated in all versions of C and is not supported in C2x}} diff --git a/clang/test/SemaCXX/MicrosoftSuper.cpp b/clang/test/SemaCXX/MicrosoftSuper.cpp index df63691..1d1460f 100644 --- a/clang/test/SemaCXX/MicrosoftSuper.cpp +++ b/clang/test/SemaCXX/MicrosoftSuper.cpp @@ -7,7 +7,7 @@ struct Errors { void foo() { // expected-note@+4 {{replace parentheses with an initializer to declare a variable}} // expected-warning@+3 {{empty parentheses interpreted as a function declaration}} - // expected-error@+2 {{C++ requires a type specifier for all declarations}} + // expected-error@+2 {{a type specifier is required for all declarations}} // expected-error@+1 {{use of '__super' inside a lambda is unsupported}} auto lambda = []{ __super::foo(); }; } diff --git a/clang/test/SemaCXX/PR9459.cpp b/clang/test/SemaCXX/PR9459.cpp index 010e228..9547a2a 100644 --- a/clang/test/SemaCXX/PR9459.cpp +++ b/clang/test/SemaCXX/PR9459.cpp @@ -3,5 +3,5 @@ // Don't crash. template<typename>struct ae_same; // expected-note {{}} -template<typename>struct ts{}ap() // expected-error {{expected ';' after struct}} expected-error {{requires a type specifier}} +template<typename>struct ts{}ap() // expected-error {{expected ';' after struct}} expected-error {{a type specifier is required}} {ts<a>::ap<ae_same<int>::&ae_same<>>::p(a); }; // expected-error {{use of undeclared identifier 'a'}} expected-error 5{{}} diff --git a/clang/test/SemaCXX/PR9460.cpp b/clang/test/SemaCXX/PR9460.cpp index 0dd8446..ab3528d 100644 --- a/clang/test/SemaCXX/PR9460.cpp +++ b/clang/test/SemaCXX/PR9460.cpp @@ -1,17 +1,17 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify %s // Don't crash. template<typename aT> struct basic_string{ - a; // expected-error {{requires a type specifier}} + a; // expected-error {{a type specifier is required}} basic_string(aT*); }; struct runtime_error{ runtime_error( basic_string<char> struct{ // expected-error {{cannot combine with previous 'type-name' declaration specifier}} -a(){ // expected-error {{requires a type specifier}} +a(){ // expected-error {{a type specifier is required}} runtime_error(0); } } diff --git a/clang/test/SemaCXX/PR9461.cpp b/clang/test/SemaCXX/PR9461.cpp index f97a208..1b82a97 100644 --- a/clang/test/SemaCXX/PR9461.cpp +++ b/clang/test/SemaCXX/PR9461.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify %s // Don't crash. @@ -18,7 +18,7 @@ int _S_construct(); int _S_construct(int); -_S_construct(); // expected-error {{requires}} +_S_construct(); // expected-error {{a type specifier is required}} }; template<typename _CharT,typename _Traits,typename _Alloc> diff --git a/clang/test/SemaCXX/crashes.cpp b/clang/test/SemaCXX/crashes.cpp index a80587d..785679c 100644 --- a/clang/test/SemaCXX/crashes.cpp +++ b/clang/test/SemaCXX/crashes.cpp @@ -5,13 +5,13 @@ // <rdar://problem/8124080> template<typename _Alloc> class allocator; template<class _CharT> struct char_traits; -template<typename _CharT, typename _Traits = char_traits<_CharT>, +template<typename _CharT, typename _Traits = char_traits<_CharT>, typename _Alloc = allocator<_CharT> > class basic_string; template<typename _CharT, typename _Traits, typename _Alloc> -const typename basic_string<_CharT, _Traits, _Alloc>::size_type +const typename basic_string<_CharT, _Traits, _Alloc>::size_type basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_max_size // expected-error{{no member named '_Rep' in 'basic_string<_CharT, _Traits, _Alloc>'}} - = (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4; + = (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4; // PR7118 template<typename T> @@ -181,8 +181,8 @@ namespace pr16964 { template<typename> struct bs { bs(); static int* member(); // expected-note{{possible target}} - member(); // expected-error{{C++ requires a type specifier for all declarations}} - static member(); // expected-error{{C++ requires a type specifier for all declarations}} + member(); // expected-error{{a type specifier is required for all declarations}} + static member(); // expected-error{{a type specifier is required for all declarations}} static int* member(int); // expected-note{{possible target}} }; @@ -237,7 +237,7 @@ namespace pr16989 { } namespace pr20660 { - appendList(int[]...); // expected-error {{C++ requires a type specifier for all declarations}} - appendList(int[]...) { } // expected-error {{C++ requires a type specifier for all declarations}} + appendList(int[]...); // expected-error {{a type specifier is required for all declarations}} + appendList(int[]...) { } // expected-error {{a type specifier is required for all declarations}} } diff --git a/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp b/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp index ddc9c8a..26f4bd3 100644 --- a/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp +++ b/clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp @@ -8,10 +8,10 @@ #define CONST constexpr #endif -template<typename T> +template<typename T> T pi = T(3.1415926535897932385); // expected-note 2{{declared here}} -template<typename T> +template<typename T> CONST T cpi = T(3.1415926535897932385); // expected-note {{template is declared here}} template<typename T> extern CONST T vc; @@ -33,7 +33,7 @@ namespace use_in_top_level_funcs { int ipi = pi; // expected-error {{use of variable template 'pi' requires template arguments}} int icpi = cpi; // expected-error {{use of variable template 'cpi' requires template arguments}} } - + template<typename T> T circular_area(T r) { return pi<T> * r * r; @@ -79,13 +79,13 @@ namespace odr_tmpl { template<typename T> T v; // expected-note {{previous definition is here}} template<typename T> int v; // expected-error {{redefinition of 'v'}} - + template<typename T> extern int v1; // expected-note {{previous template declaration is here}} template<int I> int v1; // expected-error {{template parameter has a different kind in template redeclaration}} } namespace pvt_use { template<typename T> T v; - v = 10; // expected-error {{C++ requires a type specifier for all declarations}} + v = 10; // expected-error {{a type specifier is required for all declarations}} } namespace pvt_diff_params { @@ -121,36 +121,36 @@ namespace odr_tmpl { template<typename T> extern auto v4; // expected-error {{declaration of variable 'v4' with deduced type 'auto' requires an initializer}} } #endif - + } namespace explicit_instantiation { - template<typename T> + template<typename T> T pi0a = T(3.1415926535897932385); // expected-note {{variable template 'pi0a' declared here}} template float pi0a<int>; // expected-error {{type 'float' of explicit instantiation of 'pi0a' does not match expected type 'int'}} - template<typename T> + template<typename T> T pi0b = T(3.1415926535897932385); // expected-note {{variable template 'pi0b' declared here}} template CONST int pi0b<int>; // expected-error {{type 'const int' of explicit instantiation of 'pi0b' does not match expected type 'int'}} - template<typename T> + template<typename T> T pi0c = T(3.1415926535897932385); // expected-note {{variable template 'pi0c' declared here}} template int pi0c<const int>; // expected-error {{type 'int' of explicit instantiation of 'pi0c' does not match expected type 'const int'}} - template<typename T> + template<typename T> T pi0 = T(3.1415926535897932385); template int pi0<int>; // expected-note {{previous explicit instantiation is here}} template int pi0<int>; // expected-error {{duplicate explicit instantiation of 'pi0<int>'}} - template<typename T> + template<typename T> CONST T pi1a = T(3.1415926535897932385); // expected-note {{variable template 'pi1a' declared here}} template int pi1a<int>; // expected-error {{type 'int' of explicit instantiation of 'pi1a' does not match expected type 'const int'}} - template<typename T> + template<typename T> CONST T pi1b = T(3.1415926535897932385); // expected-note {{variable template 'pi1b' declared here}} template int pi1b<const int>; // expected-error {{type 'int' of explicit instantiation of 'pi1b' does not match expected type 'const const int'}} - template<typename T> + template<typename T> CONST T pi1 = T(3.1415926535897932385); template CONST int pi1<int>; // expected-note {{previous explicit instantiation is here}} template CONST int pi1<int>; // expected-error {{duplicate explicit instantiation of 'pi1<int>'}} @@ -159,7 +159,7 @@ namespace explicit_instantiation { namespace auto_var { template<typename T> auto var0 = T(); template auto var0<int>; // expected-error {{'auto' variable template instantiation is not allowed}} - + template<typename T> auto var = T(); template int var<int>; } @@ -187,7 +187,7 @@ namespace explicit_specialization { template<> CONST int pi2<int,int> = 4; -#ifndef PRECXX11 +#ifndef PRECXX11 void foo() { static_assert(pi2<int,int> == 4, ""); static_assert(pi2<float,int> == 2, ""); @@ -209,15 +209,15 @@ namespace explicit_specialization { template<typename T> CONST int pi2<int,T> = 3; // expected-note {{partial specialization matches [with T = int]}} - + void foo() { int a = pi2<int,int>; // expected-error {{ambiguous partial specializations of 'pi2<int, int>'}} } } - + namespace type_changes { - template<typename T> + template<typename T> T pi0 = T(3.1415926535897932385); template<> float pi0<int> = 10; @@ -252,15 +252,15 @@ namespace explicit_specialization { #endif - template<typename T> + template<typename T> CONST T pi1 = T(3.1415926535897932385); template<> CONST int pi1<int> = 10; // expected-note {{previous definition is here}} template<> CONST int pi1<int> = 10; // expected-error {{redefinition of 'pi1<int>'}} } - + namespace before_instantiation { - template<typename T> + template<typename T> T pi0 = T(3.1415926535897932385); // expected-note {{variable template 'pi0' declared here}} template<> int pi0<int> = 10; // expected-note 2{{previous template specialization is here}} @@ -274,7 +274,7 @@ namespace explicit_specialization { template CONST int pi2<int,int>; } namespace after_instantiation { - template<typename T> + template<typename T> T pi0 = T(3.1415926535897932385); template int pi0<int>; // expected-note 2{{explicit instantiation first required here}} @@ -304,11 +304,11 @@ namespace explicit_specialization { } } #endif - + namespace extern_var { // TODO: } - + namespace diff_type { // TODO: template<typename T> T* var = new T(); @@ -343,7 +343,7 @@ namespace arrays { float f = 10.5; template<> float* arr<float> = &f; - + void bar() { int *iarr = arr<int>; iarr[0] = 1; @@ -357,48 +357,48 @@ namespace arrays { #endif namespace nested { - + namespace n0a { - template<typename T> + template<typename T> T pi0a = T(3.1415926535897932385); } - + using namespace n0a; int i0a = pi0a<int>; - + template float pi0a<float>; float f0a = pi0a<float>; - + template<> double pi0a<double> = 5.2; double d0a = pi0a<double>; namespace n0b { - template<typename T> + template<typename T> T pi0b = T(3.1415926535897932385); } - + int i0b = n0b::pi0b<int>; - + template float n0b::pi0b<float>; float f0b = n0b::pi0b<float>; - + template<> double n0b::pi0b<double> = 5.2; double d0b = n0b::pi0b<double>; - + namespace n1 { - template<typename T> + template<typename T> T pi1a = T(3.1415926535897932385); // expected-note {{explicitly specialized declaration is here}} #ifndef PRECXX11 // expected-note@-2 {{explicit instantiation refers here}} #endif - template<typename T> + template<typename T> T pi1b = T(3.1415926535897932385); // expected-note {{explicitly specialized declaration is here}} #ifndef PRECXX11 // expected-note@-2 {{explicit instantiation refers here}} #endif } - + namespace use_n1a { using namespace n1; int i1 = pi1a<int>; @@ -408,20 +408,20 @@ namespace nested { // expected-error@-2 {{explicit instantiation of 'pi1a<float>' not in a namespace enclosing 'n1'}} #endif float f1 = pi1a<float>; - + template<> double pi1a<double> = 5.2; // expected-error {{not in a namespace enclosing 'n1'}} double d1 = pi1a<double>; } - + namespace use_n1b { int i1 = n1::pi1b<int>; - + template float n1::pi1b<float>; #ifndef PRECXX11 // expected-error@-2 {{explicit instantiation of 'pi1b<float>' not in a namespace enclosing 'n1'}} #endif float f1 = n1::pi1b<float>; - + template<> double n1::pi1b<double> = 5.2; // expected-error {{not in a namespace enclosing 'n1'}} double d1 = n1::pi1b<double>; } @@ -451,7 +451,7 @@ namespace PR19169 { template <typename T> int* f(); template <typename T> void f(); template<> int f<double>; // expected-error {{no variable template matches specialization; did you mean to use 'f' as function template instead?}} - + template <typename T> void g(); template<> int g<double>; // expected-error {{no variable template matches specialization; did you mean to use 'g' as function template instead?}} } diff --git a/clang/test/SemaCXX/for-range-crash.cpp b/clang/test/SemaCXX/for-range-crash.cpp index 766f34e5..ff84e34 100644 --- a/clang/test/SemaCXX/for-range-crash.cpp +++ b/clang/test/SemaCXX/for-range-crash.cpp @@ -8,7 +8,7 @@ error e; // expected-error {{unknown type name}} template <typename> class Bar { Bar<int> *variables_to_modify; - foo() { // expected-error {{C++ requires a type specifier for all declarations}} + foo() { // expected-error {{a type specifier is required for all declarations}} for (auto *c : *variables_to_modify) delete c; } diff --git a/clang/test/SemaCXX/implicit-int.cpp b/clang/test/SemaCXX/implicit-int.cpp index 9711adf..31cc209 100644 --- a/clang/test/SemaCXX/implicit-int.cpp +++ b/clang/test/SemaCXX/implicit-int.cpp @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -x; // expected-error{{C++ requires a type specifier for all declarations}} +x; // expected-error{{a type specifier is required for all declarations}} -f(int y) { return y; } // expected-error{{C++ requires a type specifier for all declarations}} +f(int y) { return y; } // expected-error{{a type specifier is required for all declarations}} diff --git a/clang/test/SemaCXX/lambda-invalid-capture.cpp b/clang/test/SemaCXX/lambda-invalid-capture.cpp index c9bd0d7..2367538 100644 --- a/clang/test/SemaCXX/lambda-invalid-capture.cpp +++ b/clang/test/SemaCXX/lambda-invalid-capture.cpp @@ -2,7 +2,7 @@ // Don't crash. struct g { - j; // expected-error {{C++ requires a type specifier for all declarations}} + j; // expected-error {{a type specifier is required for all declarations}} }; void captures_invalid_type() { diff --git a/clang/test/SemaCXX/pr18284-crash-on-invalid.cpp b/clang/test/SemaCXX/pr18284-crash-on-invalid.cpp index 5b1cb21..c6e877b 100644 --- a/clang/test/SemaCXX/pr18284-crash-on-invalid.cpp +++ b/clang/test/SemaCXX/pr18284-crash-on-invalid.cpp @@ -5,7 +5,7 @@ namespace n1 { class A { }; class C { A a; }; -A::RunTest() {} // expected-error {{C++ requires a type specifier for all declarations}} +A::RunTest() {} // expected-error {{a type specifier is required for all declarations}} void f() { new C; @@ -16,7 +16,7 @@ namespace n2 { class A { }; class C : public A { }; -A::RunTest() {} // expected-error {{C++ requires a type specifier for all declarations}} +A::RunTest() {} // expected-error {{a type specifier is required for all declarations}} void f() { new C; diff --git a/clang/test/SemaCXX/typo-correction-delayed.cpp b/clang/test/SemaCXX/typo-correction-delayed.cpp index 66d19da..fdb1f740 100644 --- a/clang/test/SemaCXX/typo-correction-delayed.cpp +++ b/clang/test/SemaCXX/typo-correction-delayed.cpp @@ -159,7 +159,7 @@ __typeof blur y; // expected-error {{use of undeclared identifier 'blur'; did y } namespace PR22092 { -a = b ? : 0; // expected-error {{C++ requires a type specifier for all declarations}} \ +a = b ? : 0; // expected-error {{a type specifier is required for all declarations}} \ // expected-error-re {{use of undeclared identifier 'b'{{$}}}} } diff --git a/clang/test/SemaCXX/typo-correction.cpp b/clang/test/SemaCXX/typo-correction.cpp index 7eca5d8..60141ee 100644 --- a/clang/test/SemaCXX/typo-correction.cpp +++ b/clang/test/SemaCXX/typo-correction.cpp @@ -494,7 +494,7 @@ template <typename T> struct Wrappable { // instead of incorrectly suggesting dropping "PR18213::WrapperInfo::". template <> PR18213::WrapperInfo ::PR18213::Wrappable<int>::kWrapperInfo = { 0 }; // expected-error {{no member named 'PR18213' in 'PR18213::WrapperInfo'; did you mean simply 'PR18213'?}} \ - // expected-error {{C++ requires a type specifier for all declarations}} + // expected-error {{a type specifier is required for all declarations}} } namespace PR18651 { diff --git a/clang/test/SemaCXX/unknown-type-name.cpp b/clang/test/SemaCXX/unknown-type-name.cpp index bacdee4..6fc3137 100644 --- a/clang/test/SemaCXX/unknown-type-name.cpp +++ b/clang/test/SemaCXX/unknown-type-name.cpp @@ -116,4 +116,4 @@ template<typename T> int i(T::type, int()); // FIXME: We know which type specifier should have been specified here. Provide // a fix-it to add 'typename A<T>::type' template<typename T> -A<T>::g() { } // expected-error{{requires a type specifier}} +A<T>::g() { } // expected-error{{a type specifier is required}} diff --git a/clang/test/SemaObjC/protocols.m b/clang/test/SemaObjC/protocols.m index eb27341..ebb9b63 100644 --- a/clang/test/SemaObjC/protocols.m +++ b/clang/test/SemaObjC/protocols.m @@ -62,6 +62,6 @@ @end @protocol P -- (int)test:(int)param, ..; // expected-warning{{type specifier missing}} \ +- (int)test:(int)param, ..; // expected-error{{type specifier missing}} \ // expected-error{{expected ';' after method prototype}} @end diff --git a/clang/test/SemaObjCXX/crash.mm b/clang/test/SemaObjCXX/crash.mm index a9754b7..6a7f0fb 100644 --- a/clang/test/SemaObjCXX/crash.mm +++ b/clang/test/SemaObjCXX/crash.mm @@ -42,21 +42,21 @@ namespace ns { // expected-error@-1 {{type name requires a specifier or qualifier}} // expected-error@-2 {{property requires fields to be named}} // expected-error@-3 {{expected ';' at end of declaration list}} -// expected-error@-4 {{C++ requires a type specifier for all declarations}} +// expected-error@-4 {{a type specifier is required for all declarations}} // expected-error@-5 {{cannot declare variable inside @interface or @protocol}} @property (nonatomic) (ns::InnerType) invalidTypeParens2; // expected-error@-1 {{type name requires a specifier or qualifier}} // expected-error@-2 {{property requires fields to be named}} // expected-error@-3 {{expected ';' at end of declaration list}} -// expected-error@-4 {{C++ requires a type specifier for all declarations}} +// expected-error@-4 {{a type specifier is required for all declarations}} // expected-error@-5 {{cannot declare variable inside @interface or @protocol}} @property (nonatomic) int OuterType::InnerType; // expected-error {{property requires fields to be named}} @property (nonatomic) int OuterType::InnerType foo; // expected-error {{property requires fields to be named}} // expected-error@-1 {{expected ';' at end of declaration list}} -// expected-error@-2 {{C++ requires a type specifier for all declarations}} +// expected-error@-2 {{a type specifier is required for all declarations}} // expected-error@-3 {{cannot declare variable inside @interface or @protocol}} @end diff --git a/clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl b/clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl index 9e2869a..2ea6d3bc 100644 --- a/clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl +++ b/clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl @@ -10,7 +10,7 @@ void foo(read_only pipe int p); // expected-error@-5 {{C++ for OpenCL version 2021 does not support the 'pipe' type qualifier}} // expected-error@-6 {{access qualifier can only be used for pipe and image type}} #else -// expected-warning@-8 {{type specifier missing, defaults to 'int'}} +// expected-error@-8 {{type specifier missing, defaults to 'int'}} // expected-error@-9 {{access qualifier can only be used for pipe and image type}} // expected-error@-10 {{expected ')'}} expected-note@-10 {{to match this '('}} #endif diff --git a/clang/test/SemaTemplate/address_space-dependent.cpp b/clang/test/SemaTemplate/address_space-dependent.cpp index de23e69..682ab75 100644 --- a/clang/test/SemaTemplate/address_space-dependent.cpp +++ b/clang/test/SemaTemplate/address_space-dependent.cpp @@ -9,7 +9,7 @@ void car() { __attribute__((address_space(J))) int array[5]; // expected-error {{automatic variable qualified with an address space}} __attribute__((address_space(I))) int arrarr[5][5]; // expected-error {{automatic variable qualified with an address space}} - __attribute__((address_space(J))) * x; // expected-error {{C++ requires a type specifier for all declarations}} + __attribute__((address_space(J))) * x; // expected-error {{a type specifier is required for all declarations}} __attribute__((address_space(I))) float *B; @@ -89,12 +89,12 @@ template <unsigned B> int __attribute__((address_space(B+1))) *different_templat void test_different_template() { (void) different_template<0>(); } // expected-error {{call to 'different_template' is ambiguous}} template <typename T> struct partial_spec_deduce_as; -template <typename T, unsigned AS> +template <typename T, unsigned AS> struct partial_spec_deduce_as <__attribute__((address_space(AS))) T *> { - static const unsigned value = AS; -}; + static const unsigned value = AS; +}; -int main() { +int main() { int __attribute__((address_space(1))) * p1; int p = GetAddressSpaceValue(p1); @@ -112,8 +112,8 @@ int main() { ff.get_0(); // expected-note {{in instantiation of member function 'fooFunction<1>::get_0' requested here}} ff.qf(); ff.test3(); // expected-note {{in instantiation of member function 'fooFunction<1>::test3' requested here}} - - static_assert(partial_spec_deduce_as<int __attribute__((address_space(3))) *>::value == 3, "address space value has been incorrectly deduced"); + + static_assert(partial_spec_deduce_as<int __attribute__((address_space(3))) *>::value == 3, "address space value has been incorrectly deduced"); return 0; } diff --git a/clang/test/SemaTemplate/derived.cpp b/clang/test/SemaTemplate/derived.cpp index d95e577..51e4db3 100644 --- a/clang/test/SemaTemplate/derived.cpp +++ b/clang/test/SemaTemplate/derived.cpp @@ -14,7 +14,7 @@ void test() { namespace rdar13267210 { template < typename T > class A { - BaseTy; // expected-error{{C++ requires a type specifier for all declarations}} + BaseTy; // expected-error{{a type specifier is required for all declarations}} }; template < typename T, int N > class C: A < T > {}; diff --git a/clang/test/SemaTemplate/temp_arg_template.cpp b/clang/test/SemaTemplate/temp_arg_template.cpp index 37e1e52..3ab8472 100644 --- a/clang/test/SemaTemplate/temp_arg_template.cpp +++ b/clang/test/SemaTemplate/temp_arg_template.cpp @@ -19,7 +19,7 @@ namespace N { template<class, class> struct TooMany; // expected-note{{too many template parameters in template template argument}} -A<X> *a1; +A<X> *a1; A<N::Z> *a2; A< ::N::Z> *a3; @@ -42,19 +42,19 @@ A<::N::Z> *a10; // Do not do a digraph correction here. A<: :N::Z> *a11; // expected-error{{expected expression}} \ - expected-error{{C++ requires a type specifier for all declarations}} + expected-error{{a type specifier is required for all declarations}} // PR7807 namespace N { - template <typename, typename = int> + template <typename, typename = int> struct X { }; - template <typename ,int> + template <typename ,int> struct Y { X<int> const_ref(); }; - template <template<typename,int> class TT, typename T, int N> + template <template<typename,int> class TT, typename T, int N> int operator<<(int, TT<T, N> a) { // expected-note{{candidate template ignored}} 0 << a.const_ref(); // expected-error{{invalid operands to binary expression ('int' and 'X<int>')}} } diff --git a/clang/test/Tooling/auto-detect-from-source-parent-of-cwd.cpp b/clang/test/Tooling/auto-detect-from-source-parent-of-cwd.cpp index 4859372..762c89e 100644 --- a/clang/test/Tooling/auto-detect-from-source-parent-of-cwd.cpp +++ b/clang/test/Tooling/auto-detect-from-source-parent-of-cwd.cpp @@ -6,7 +6,7 @@ // RUN: cd %t/abc/def2 // RUN: env PWD="%t/abc/def" not clang-check "ijk/qwe/test.cpp" 2>&1 | FileCheck %s -// CHECK: C++ requires +// CHECK: a type specifier is required // CHECK: /abc/def/ijk/qwe/test.cpp invalid; diff --git a/clang/test/Tooling/auto-detect-from-source-parent.cpp b/clang/test/Tooling/auto-detect-from-source-parent.cpp index 830d09d..45075f4 100644 --- a/clang/test/Tooling/auto-detect-from-source-parent.cpp +++ b/clang/test/Tooling/auto-detect-from-source-parent.cpp @@ -4,5 +4,5 @@ // RUN: cp "%s" "%t/abc/def/ijk/qwe/test.cpp" // RUN: not clang-check "%t/abc/def/ijk/qwe/test.cpp" 2>&1 | FileCheck %s -// CHECK: C++ requires +// CHECK: a type specifier is required invalid; diff --git a/clang/test/Tooling/clang-check-args.cpp b/clang/test/Tooling/clang-check-args.cpp index 202b237..d75f6b8 100644 --- a/clang/test/Tooling/clang-check-args.cpp +++ b/clang/test/Tooling/clang-check-args.cpp @@ -1,4 +1,4 @@ // RUN: not clang-check "%s" -- -c 2>&1 | FileCheck %s -// CHECK: C++ requires +// CHECK: a type specifier is required invalid; diff --git a/clang/test/Tooling/clang-check-autodetect-dir.cpp b/clang/test/Tooling/clang-check-autodetect-dir.cpp index b84f3fe..889818e 100644 --- a/clang/test/Tooling/clang-check-autodetect-dir.cpp +++ b/clang/test/Tooling/clang-check-autodetect-dir.cpp @@ -5,5 +5,5 @@ // RUN: not clang-check -p "%t/abc/def" "%t/test.cpp" 2>&1|FileCheck %s // FIXME: Make the above easier. -// CHECK: C++ requires +// CHECK: a type specifier is required invalid; diff --git a/clang/test/Tooling/clang-check-builtin-headers.cpp b/clang/test/Tooling/clang-check-builtin-headers.cpp index 76fc9c4b..3849f30 100644 --- a/clang/test/Tooling/clang-check-builtin-headers.cpp +++ b/clang/test/Tooling/clang-check-builtin-headers.cpp @@ -8,5 +8,5 @@ #include <stddef.h> -// CHECK: C++ requires +// CHECK: a type specifier is required invalid; diff --git a/clang/test/Tooling/clang-check-chdir.cpp b/clang/test/Tooling/clang-check-chdir.cpp index fbe8a19..eea60f1 100644 --- a/clang/test/Tooling/clang-check-chdir.cpp +++ b/clang/test/Tooling/clang-check-chdir.cpp @@ -10,5 +10,5 @@ #include "clang-check-test.h" -// CHECK: C++ requires +// CHECK: a type specifier is required invalid; diff --git a/clang/test/Tooling/clang-check-pwd.cpp b/clang/test/Tooling/clang-check-pwd.cpp index fe2e1e9..2e8d4a3 100644 --- a/clang/test/Tooling/clang-check-pwd.cpp +++ b/clang/test/Tooling/clang-check-pwd.cpp @@ -7,7 +7,7 @@ // RUN: env PWD="%t.foobar" not clang-check -p "%t" "test.cpp" 2>&1|FileCheck %s // FIXME: Make the above easier. -// CHECK: C++ requires +// CHECK: a type specifier is required // CHECK: .foobar/test.cpp invalid; diff --git a/clang/test/Tooling/clang-check-rel-path.cpp b/clang/test/Tooling/clang-check-rel-path.cpp index 23a9345..5ea2859 100644 --- a/clang/test/Tooling/clang-check-rel-path.cpp +++ b/clang/test/Tooling/clang-check-rel-path.cpp @@ -6,5 +6,5 @@ // RUN: not clang-check -p "%t" "%t/test.cpp" 2>&1|FileCheck %s // FIXME: Make the above easier. -// CHECK: C++ requires +// CHECK: a type specifier is required invalid; diff --git a/clang/test/Tooling/clang-check-strip-o.cpp b/clang/test/Tooling/clang-check-strip-o.cpp index e33367b..156f15a 100644 --- a/clang/test/Tooling/clang-check-strip-o.cpp +++ b/clang/test/Tooling/clang-check-strip-o.cpp @@ -7,5 +7,5 @@ // CHECK: Invocation // CHECK-NOT: {{ -v}} -// CHECK: C++ requires +// CHECK: a type specifier is required invalid; diff --git a/clang/test/Tooling/clang-check.cpp b/clang/test/Tooling/clang-check.cpp index e3fb49c..0bc821f 100644 --- a/clang/test/Tooling/clang-check.cpp +++ b/clang/test/Tooling/clang-check.cpp @@ -5,5 +5,5 @@ // RUN: not clang-check -p "%t" "%t/test.cpp" 2>&1|FileCheck %s // FIXME: Make the above easier. -// CHECK: C++ requires +// CHECK: a type specifier is required invalid; diff --git a/clang/test/Tooling/multi-jobs.cpp b/clang/test/Tooling/multi-jobs.cpp index 980ade4..e9716d0 100644 --- a/clang/test/Tooling/multi-jobs.cpp +++ b/clang/test/Tooling/multi-jobs.cpp @@ -2,5 +2,5 @@ // The following test uses multiple time the same '-no-integrated-as' flag in order to make sure those flags are really skipped, and not just overwritten by luck : // RUN: not clang-check "%s" -- -target x86_64-win32 -c -no-integrated-as -no-integrated-as -no-integrated-as 2>&1 | FileCheck %s -// CHECK: C++ requires +// CHECK: a type specifier is required invalid; diff --git a/clang/unittests/AST/SourceLocationTest.cpp b/clang/unittests/AST/SourceLocationTest.cpp index 28205c2..18054d3 100644 --- a/clang/unittests/AST/SourceLocationTest.cpp +++ b/clang/unittests/AST/SourceLocationTest.cpp @@ -135,13 +135,19 @@ TEST(LabelStmt, Range) { TEST(ParmVarDecl, KNRLocation) { LocationVerifier<ParmVarDecl> Verifier; Verifier.expectLocation(1, 8); - EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C99)); + EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C89)); + + Verifier.expectLocation(1, 15); + EXPECT_TRUE(Verifier.match("void f(i) int i; {}", varDecl(), Lang_C99)); } TEST(ParmVarDecl, KNRRange) { RangeVerifier<ParmVarDecl> Verifier; Verifier.expectRange(1, 8, 1, 8); - EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C99)); + EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C89)); + + Verifier.expectRange(1, 11, 1, 15); + EXPECT_TRUE(Verifier.match("void f(i) int i; {}", varDecl(), Lang_C99)); } TEST(CXXNewExpr, ArrayRange) { |