aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp32
-rw-r--r--clang-tools-extra/test/clang-tidy/checkers/altera-struct-pack-align-invalid-decl-no-crash.cpp2
-rw-r--r--clang-tools-extra/test/clang-tidy/infrastructure/export-diagnostics.cpp4
-rw-r--r--clang/docs/ReleaseNotes.rst12
-rw-r--r--clang/include/clang/Basic/DiagnosticCommonKinds.td4
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td15
-rw-r--r--clang/include/clang/Basic/LangOptions.def1
-rw-r--r--clang/include/clang/Basic/LangOptions.h6
-rw-r--r--clang/include/clang/Basic/LangStandard.h8
-rw-r--r--clang/include/clang/Basic/LangStandards.def7
-rw-r--r--clang/lib/Basic/LangOptions.cpp1
-rw-r--r--clang/lib/Parse/ParseDecl.cpp4
-rw-r--r--clang/lib/Parse/Parser.cpp6
-rw-r--r--clang/lib/Sema/SemaDecl.cpp26
-rw-r--r--clang/lib/Sema/SemaType.cpp27
-rw-r--r--clang/test/Analysis/PR49642.c2
-rw-r--r--clang/test/Analysis/inline-unique-reports.c2
-rw-r--r--clang/test/Analysis/malloc.c2
-rw-r--r--clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p2.cpp2
-rw-r--r--clang/test/CXX/drs/dr2xx.cpp2
-rw-r--r--clang/test/CXX/drs/dr4xx.cpp2
-rw-r--r--clang/test/CXX/drs/dr5xx.cpp26
-rw-r--r--clang/test/CXX/modules-ts/basic/basic.link/module-declaration.cpp2
-rw-r--r--clang/test/CXX/temp/p3.cpp2
-rw-r--r--clang/test/CXX/temp/temp.deduct.guide/p3.cpp4
-rw-r--r--clang/test/CXX/temp/temp.res/temp.local/p3.cpp4
-rw-r--r--clang/test/CodeGen/2002-07-14-MiscTests2.c2
-rw-r--r--clang/test/CodeGen/2003-08-20-vfork-bug.c2
-rw-r--r--clang/test/CodeGen/2007-04-24-bit-not-expr.c2
-rw-r--r--clang/test/CodeGen/2007-09-26-Alignment.c2
-rw-r--r--clang/test/CodeGen/2010-07-14-ref-off-end.c4
-rw-r--r--clang/test/CodeGen/mips-clobber-reg.c2
-rw-r--r--clang/test/CodeGen/mips-vector-arg.c12
-rw-r--r--clang/test/Driver/cxx_for_opencl.clcpp2
-rw-r--r--clang/test/FixIt/fixit.c4
-rw-r--r--clang/test/Frontend/fixed_point_errors.c4
-rw-r--r--clang/test/Frontend/fixed_point_not_enabled.c2
-rw-r--r--clang/test/Frontend/system-header-line-directive.c2
-rw-r--r--clang/test/Index/reparsed-live-issue.cpp2
-rw-r--r--clang/test/Misc/warning-flags.c5
-rw-r--r--clang/test/Modules/malformed-overload.m2
-rw-r--r--clang/test/Modules/va_list.m8
-rw-r--r--clang/test/PCH/decl-in-prototype.c2
-rw-r--r--clang/test/Parser/altivec.c4
-rw-r--r--clang/test/Parser/attributes.c10
-rw-r--r--clang/test/Parser/backtrack-off-by-one.cpp2
-rw-r--r--clang/test/Parser/c2x-attributes.c6
-rw-r--r--clang/test/Parser/c2x-func-prototype.c2
-rw-r--r--clang/test/Parser/colon-colon-parentheses.cpp2
-rw-r--r--clang/test/Parser/cxx-altivec.cpp3
-rw-r--r--clang/test/Parser/cxx-concepts-ambig-constraint-expr.cpp2
-rw-r--r--clang/test/Parser/cxx-decl.cpp12
-rw-r--r--clang/test/Parser/cxx-keyword-identifiers.cpp2
-rw-r--r--clang/test/Parser/cxx-template-decl.cpp16
-rw-r--r--clang/test/Parser/cxx-undeclared-identifier.cpp8
-rw-r--r--clang/test/Parser/cxx2b-lambdas.cpp2
-rw-r--r--clang/test/Parser/declarators.c8
-rw-r--r--clang/test/Parser/explicit-bool.cpp2
-rw-r--r--clang/test/Parser/ext-int.cpp6
-rw-r--r--clang/test/Parser/objc-forcollection-neg-2.m2
-rw-r--r--clang/test/Parser/static_assert.c2
-rw-r--r--clang/test/Preprocessor/macro_paste_msextensions.c2
-rw-r--r--clang/test/Sema/address_spaces.c2
-rw-r--r--clang/test/Sema/auto-type.c2
-rw-r--r--clang/test/Sema/block-args.c2
-rw-r--r--clang/test/Sema/block-literal.c8
-rw-r--r--clang/test/Sema/c89.c14
-rw-r--r--clang/test/Sema/crash-invalid-builtin.c2
-rw-r--r--clang/test/Sema/darwin-tls.c14
-rw-r--r--clang/test/Sema/function.c6
-rw-r--r--clang/test/Sema/implicit-int.c37
-rw-r--r--clang/test/Sema/invalid-decl.c2
-rw-r--r--clang/test/Sema/invalid-struct-init.c14
-rw-r--r--clang/test/Sema/redefinition.c2
-rw-r--r--clang/test/Sema/return.c8
-rw-r--r--clang/test/Sema/typo-correction.c4
-rw-r--r--clang/test/Sema/warn-strict-prototypes.c7
-rw-r--r--clang/test/SemaCXX/MicrosoftSuper.cpp2
-rw-r--r--clang/test/SemaCXX/PR9459.cpp2
-rw-r--r--clang/test/SemaCXX/PR9460.cpp6
-rw-r--r--clang/test/SemaCXX/PR9461.cpp4
-rw-r--r--clang/test/SemaCXX/crashes.cpp14
-rw-r--r--clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp86
-rw-r--r--clang/test/SemaCXX/for-range-crash.cpp2
-rw-r--r--clang/test/SemaCXX/implicit-int.cpp4
-rw-r--r--clang/test/SemaCXX/lambda-invalid-capture.cpp2
-rw-r--r--clang/test/SemaCXX/pr18284-crash-on-invalid.cpp4
-rw-r--r--clang/test/SemaCXX/typo-correction-delayed.cpp2
-rw-r--r--clang/test/SemaCXX/typo-correction.cpp2
-rw-r--r--clang/test/SemaCXX/unknown-type-name.cpp2
-rw-r--r--clang/test/SemaObjC/protocols.m2
-rw-r--r--clang/test/SemaObjCXX/crash.mm6
-rw-r--r--clang/test/SemaOpenCL/invalid-pipes-cl1.2.cl2
-rw-r--r--clang/test/SemaTemplate/address_space-dependent.cpp14
-rw-r--r--clang/test/SemaTemplate/derived.cpp2
-rw-r--r--clang/test/SemaTemplate/temp_arg_template.cpp10
-rw-r--r--clang/test/Tooling/auto-detect-from-source-parent-of-cwd.cpp2
-rw-r--r--clang/test/Tooling/auto-detect-from-source-parent.cpp2
-rw-r--r--clang/test/Tooling/clang-check-args.cpp2
-rw-r--r--clang/test/Tooling/clang-check-autodetect-dir.cpp2
-rw-r--r--clang/test/Tooling/clang-check-builtin-headers.cpp2
-rw-r--r--clang/test/Tooling/clang-check-chdir.cpp2
-rw-r--r--clang/test/Tooling/clang-check-pwd.cpp2
-rw-r--r--clang/test/Tooling/clang-check-rel-path.cpp2
-rw-r--r--clang/test/Tooling/clang-check-strip-o.cpp2
-rw-r--r--clang/test/Tooling/clang-check.cpp2
-rw-r--r--clang/test/Tooling/multi-jobs.cpp2
-rw-r--r--clang/unittests/AST/SourceLocationTest.cpp10
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) {