From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 4B8413858D37 for ; Thu, 30 Nov 2023 19:15:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4B8413858D37 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4B8413858D37 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701371750; cv=none; b=CEKqBFutnYg+YgfdClWZTLHFPVz62HpxuxZwwP4nDUmo8iYpZiUwb7zTaIQ8EAYcYXt0hJO1AbMmUY3MuyUBKeLK+CbKiWej0d7FUleBaANT1Fm1QN33VAk9iNca4hGveECjbRG35vY94ag14U2XohaUxiTGvry1i/Ytb77Qd6M= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701371750; c=relaxed/simple; bh=8IdWC2ciHVExPk7dj2yJGa7hCSG618KrMUE7NmTeZj4=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=gQCvbN7zhZf78pWA6SOWIsMGgBOa2Nyxbcr/Kc8T1k4KrOWL02d0WJiyeJXOQivmzeoCl4pS9+GEvDz7dKNXE8urTJxpBbypGTiRJgrzIUhi2AM8AMOr5Ucbjj1jADmkJCr+2Xe8pkcDg+1Tm0biVBGErtLf67cHbEXVxpjX7LM= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1701371745; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=gIVqrT3ol1ECbOj5TFkgKISCrLzCsqValScQ70J1c6c=; b=BPEhwC2xSxVau2TPYXGo+9YAtAr8oLAvsSt+Z23UAk/cYIFcmnl9dCQuWH4rq82Ezy6ms1 koqDp6tBLtwjHKx2BOIX8N5YHlZRTOwBTvbwU8/pMUv+fgu73KyLjHu5SSUoOnE1657huS tuZSuusEwq16mZBJNCkwKccz34RxVXI= Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-202-JeS6qRovPkWi8Mbr9uUYdg-1; Thu, 30 Nov 2023 14:15:41 -0500 X-MC-Unique: JeS6qRovPkWi8Mbr9uUYdg-1 Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-423e684dc6eso15158811cf.1 for ; Thu, 30 Nov 2023 11:15:41 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701371741; x=1701976541; h=user-agent:in-reply-to:content-disposition:mime-version:references :message-id:subject:cc:to:from:date:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qDqKFt85qH7OVRxd3Bo7XpCPBFYzx6F53LAvgYhE7xI=; b=VEOeLOtLBnZtt5E9jrwmhW1H7ehe+3Kpc9r9IvEAKO498i4CC0jwZ1eZnkt2/eOgha VR+NxdDXIDGrBDlYTnTX8Gt8AtUCael6rifGtsffiLX21Me8/2EoZpkBB53i1TPdLCDL 9lSE/rPTAEDrpjiX1g9M0ifAvv7xKJ9jeg0en/9YIdj1euM6+Yc5UuJRFURWfjQ7C+dX ECaLQQl5948uXyhtJwuVZc/TMMz+oJA1u0Xc7tS6qm/7X6u9ndJNYk3LXBsCZ11euHVa MbNPIk4w9LJedDyKebRypDZ/S5De1a3y132fERXB98xq3JH6yRaXVovBk1+mtM87X66I xVQg== X-Gm-Message-State: AOJu0YyDlrQlc5A1cd+LT3Iv1mt8l0rhy8Q0TsMOHfrqmFuSzjHaUQqJ t6sD8iOOP4n99GKArI1LsyxkWqQUM4LXPy9zkijtXmbpcxxKazUDdDDXHDOoOOUWfzgqaVe6MFh 4YmQwKYK4PyVX3QW/gw== X-Received: by 2002:ac8:5ac1:0:b0:419:82fa:710c with SMTP id d1-20020ac85ac1000000b0041982fa710cmr27498575qtd.5.1701371740085; Thu, 30 Nov 2023 11:15:40 -0800 (PST) X-Google-Smtp-Source: AGHT+IEBJZthpffxkR+tYyYRY0UBKn0O6dRwa5pb4fE0wiBXrkWCKW0803wht63ALaIt5lp2CQmxsw== X-Received: by 2002:ac8:5ac1:0:b0:419:82fa:710c with SMTP id d1-20020ac85ac1000000b0041982fa710cmr27498523qtd.5.1701371739357; Thu, 30 Nov 2023 11:15:39 -0800 (PST) Received: from redhat.com (2603-7000-9500-34a5-0000-0000-0000-1db4.res6.spectrum.com. [2603:7000:9500:34a5::1db4]) by smtp.gmail.com with ESMTPSA id w2-20020ac87182000000b00423de58d3d8sm749654qto.40.2023.11.30.11.15.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Nov 2023 11:15:38 -0800 (PST) Date: Thu, 30 Nov 2023 14:15:37 -0500 From: Marek Polacek To: Florian Weimer Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH v3 06/11] c: Turn -Wimplicit-function-declaration into a permerror Message-ID: References: <1f9c86b42e3c99ba679df6282f6c28f359c3f4ec.1700473918.git.fweimer@redhat.com> MIME-Version: 1.0 In-Reply-To: <1f9c86b42e3c99ba679df6282f6c28f359c3f4ec.1700473918.git.fweimer@redhat.com> User-Agent: Mutt/2.2.9 (2022-11-12) X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-21.9 required=5.0 tests=BAYES_00,DKIM_INVALID,DKIM_SIGNED,GIT_PATCH_0,KAM_DMARC_NONE,KAM_DMARC_STATUS,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Mon, Nov 20, 2023 at 10:56:16AM +0100, Florian Weimer wrote: > In the future, it may make sense to avoid cascading errors from > the implicit declaration, especially its assumed int return type. > This change here only changes the kind of the diagnostic, not > its wording or consequences. Looks fine. > gcc/ > > * doc/invoke.texi (Warning Options): Document changes. > > gcc/c/ > > PR c/91092 > PR c/96284 > * c-decl.cc (implicit_decl_permerror): Rename from > implicit_decl_warning. Call permerror_opt instead of > pedwarn and warning_at. > (implicitly_declare): Adjust callers. > > gcc/testsuite/ > > * gcc.dg/permerror-default.c (implicit_function_declaration): > Expect the new permerror. > * gcc.dg/permerror-system.c: Likewise. > * c-c++-common/spellcheck-reserved.c (test, test_2): Expect > error instead of warning. > (f): Expect error instead of warning. > * gcc.dg/Wimplicit-function-declaration-c99.c: Compile with > -fpermissive due to expected warning. > * gcc.dg/Wimplicit-function-declaration-c99-2.c: New test. > Copied from gcc.dg/Wimplicit-function-declaration-c99.c. > Expect error. > * gcc.dg/missing-header-fixit-1.c: Compile with -fpermissive > due to expect error. > * gcc.dg/missing-header-fixit-1a.c: New test. Copied from > gcc.dg/missing-header-fixit-1.c, but expect error. > * gcc.dg/missing-header-fixit-2.c: Compile with -fpermissive > due to expect error. > * gcc.dg/missing-header-fixit-2a.c: New test. Copied from > gcc.dg/missing-header-fixit-2.c, but expect error. > * gcc.dg/missing-header-fixit-4.c: Compile with -fpermissive > due to expect error. > * gcc.dg/missing-header-fixit-4a.c: New test. Copied from > gcc.dg/missing-header-fixit-4.c, but expect error. > * gcc.dg/missing-header-fixit-5.c: Compile with -fpermissive > due to expect error. > * gcc.dg/missing-header-fixit-5a.c: New test. Copied from > gcc.dg/missing-header-fixit-5.c, but expect error. > * gcc.dg/pr61852.c: Expect implicit-function-declaration > error instead of warning. > * gcc.dg/spellcheck-identifiers-2.c: Compile with > -fpermissive due to expected warnings. > * gcc.dg/spellcheck-identifiers-2a.c: New test. Copied > from gcc.dg/spellcheck-identifiers-2a.c. Expect errors. > * gcc.dg/spellcheck-identifiers-3.c: Compile with > -fpermissive due to expected warnings. > * gcc.dg/spellcheck-identifiers-3a.c: New test. Copied > from gcc.dg/spellcheck-identifiers-2a.c. Expect errors. > * gcc.dg/spellcheck-identifiers-4.c: Compile with > -fpermissive due to expected warnings. > * gcc.dg/spellcheck-identifiers-4a.c: New test. Copied > from gcc.dg/spellcheck-identifiers-2a.c. Expect error. > * gcc.dg/spellcheck-identifiers.c: Compile with > -fpermissive due to expected warnings. > * gcc.dg/spellcheck-identifiers-1a.c: New test. Copied > from gcc.dg/spellcheck-identifiers.c. Expect errors. > * gcc.target/aarch64/sve/acle/general-c/ld1sh_gather_1.c (f1): > Expect error. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_1.c: > (f1): Likewise. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_restricted_1.c: > (f1): Likewise. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_1.c: > (f1): Likewise. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_2.c: > (f1): Likewise. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_3.c: > (f1): Likewise. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_4.c: > (f1): Likewise. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_5.c: > (f1): Likewise. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c: > (f1): Likewise. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c: > (f1): Likewise. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c: > (f1): Likewise. > * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c: > (f1): Likewise. > --- > gcc/c/c-decl.cc | 20 +-- > gcc/doc/invoke.texi | 8 +- > .../c-c++-common/spellcheck-reserved.c | 4 +- > .../Wimplicit-function-declaration-c99-2.c | 7 + > .../Wimplicit-function-declaration-c99.c | 2 +- > gcc/testsuite/gcc.dg/missing-header-fixit-1.c | 2 +- > .../gcc.dg/missing-header-fixit-1a.c | 37 +++++ > gcc/testsuite/gcc.dg/missing-header-fixit-2.c | 2 +- > .../gcc.dg/missing-header-fixit-2a.c | 31 ++++ > gcc/testsuite/gcc.dg/missing-header-fixit-4.c | 2 +- > .../gcc.dg/missing-header-fixit-4a.c | 27 ++++ > gcc/testsuite/gcc.dg/missing-header-fixit-5.c | 2 +- > .../gcc.dg/missing-header-fixit-5a.c | 42 ++++++ > gcc/testsuite/gcc.dg/permerror-default.c | 2 +- > gcc/testsuite/gcc.dg/permerror-system.c | 2 + > gcc/testsuite/gcc.dg/pr61852.c | 4 +- > .../gcc.dg/spellcheck-identifiers-1a.c | 136 ++++++++++++++++++ > .../gcc.dg/spellcheck-identifiers-2.c | 2 +- > .../gcc.dg/spellcheck-identifiers-2a.c | 33 +++++ > .../gcc.dg/spellcheck-identifiers-3.c | 2 +- > .../gcc.dg/spellcheck-identifiers-3a.c | 45 ++++++ > .../gcc.dg/spellcheck-identifiers-4.c | 2 +- > .../gcc.dg/spellcheck-identifiers-4a.c | 10 ++ > gcc/testsuite/gcc.dg/spellcheck-identifiers.c | 2 +- > .../sve/acle/general-c/ld1sh_gather_1.c | 2 +- > .../acle/general-c/load_ext_gather_index_1.c | 2 +- > .../load_ext_gather_index_restricted_1.c | 2 +- > .../acle/general-c/load_ext_gather_offset_1.c | 2 +- > .../acle/general-c/load_ext_gather_offset_2.c | 2 +- > .../acle/general-c/load_ext_gather_offset_3.c | 2 +- > .../acle/general-c/load_ext_gather_offset_4.c | 2 +- > .../acle/general-c/load_ext_gather_offset_5.c | 2 +- > .../load_ext_gather_offset_restricted_1.c | 2 +- > .../load_ext_gather_offset_restricted_2.c | 2 +- > .../load_ext_gather_offset_restricted_3.c | 2 +- > .../load_ext_gather_offset_restricted_4.c | 2 +- > 36 files changed, 412 insertions(+), 38 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99-2.c > create mode 100644 gcc/testsuite/gcc.dg/missing-header-fixit-1a.c > create mode 100644 gcc/testsuite/gcc.dg/missing-header-fixit-2a.c > create mode 100644 gcc/testsuite/gcc.dg/missing-header-fixit-4a.c > create mode 100644 gcc/testsuite/gcc.dg/missing-header-fixit-5a.c > create mode 100644 gcc/testsuite/gcc.dg/spellcheck-identifiers-1a.c > create mode 100644 gcc/testsuite/gcc.dg/spellcheck-identifiers-2a.c > create mode 100644 gcc/testsuite/gcc.dg/spellcheck-identifiers-3a.c > create mode 100644 gcc/testsuite/gcc.dg/spellcheck-identifiers-4a.c > > diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc > index 64d3a941cb9..011f0bf0a69 100644 > --- a/gcc/c/c-decl.cc > +++ b/gcc/c/c-decl.cc > @@ -3493,12 +3493,12 @@ pushdecl (tree x) > } > > > -/* Issue a warning about implicit function declaration. ID is the function > +/* Issue a permerror about implicit function declaration. ID is the function > identifier, OLDDECL is a declaration of the function in a different scope, > or NULL_TREE. */ > > static void > -implicit_decl_warning (location_t loc, tree id, tree olddecl) > +implicit_decl_permerror (location_t loc, tree id, tree olddecl) > { > if (!warn_implicit_function_declaration) > return; > @@ -3515,14 +3515,14 @@ implicit_decl_warning (location_t loc, tree id, tree olddecl) > { > gcc_rich_location richloc (loc); > richloc.add_fixit_replace (suggestion); > - warned = pedwarn (&richloc, OPT_Wimplicit_function_declaration, > - "implicit declaration of function %qE;" > - " did you mean %qs?", > - id, suggestion); > + warned = permerror_opt (&richloc, OPT_Wimplicit_function_declaration, > + "implicit declaration of function %qE;" > + " did you mean %qs?", > + id, suggestion); > } > else > - warned = pedwarn (loc, OPT_Wimplicit_function_declaration, > - "implicit declaration of function %qE", id); > + warned = permerror_opt (loc, OPT_Wimplicit_function_declaration, > + "implicit declaration of function %qE", id); > } > else if (const char *suggestion = hint.suggestion ()) > { > @@ -3812,7 +3812,7 @@ implicitly_declare (location_t loc, tree functionid) > then recycle the old declaration but with the new type. */ > if (!C_DECL_IMPLICIT (decl)) > { > - implicit_decl_warning (loc, functionid, decl); > + implicit_decl_permerror (loc, functionid, decl); > C_DECL_IMPLICIT (decl) = 1; > } > if (fndecl_built_in_p (decl)) > @@ -3865,7 +3865,7 @@ implicitly_declare (location_t loc, tree functionid) > DECL_EXTERNAL (decl) = 1; > TREE_PUBLIC (decl) = 1; > C_DECL_IMPLICIT (decl) = 1; > - implicit_decl_warning (loc, functionid, 0); > + implicit_decl_permerror (loc, functionid, 0); > asmspec_tree = maybe_apply_renaming_pragma (decl, /*asmname=*/NULL); > if (asmspec_tree) > set_user_assembler_name (decl, TREE_STRING_POINTER (asmspec_tree)); > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > index 753bc62f1d4..055cca08f1c 100644 > --- a/gcc/doc/invoke.texi > +++ b/gcc/doc/invoke.texi > @@ -6181,6 +6181,7 @@ only by this flag, but it also downgrades some C and C++ diagnostics > that have their own flag: > > @gccoptlist{ > +-Wimplicit-function-declaration @r{(C)} > -Wint-conversion @r{(C)} > -Wnarrowing @r{(C++)} > } > @@ -6861,8 +6862,11 @@ This warning is upgraded to an error by @option{-pedantic-errors}. > @opindex Wno-implicit-function-declaration > @item -Wno-implicit-function-declaration @r{(C and Objective-C only)} > This option controls warnings when a function is used before being declared. > -This warning is enabled by default in C99 and later dialects of C, > -and also by @option{-Wall}. > +This warning is enabled by default, as an error, in C99 and later > +dialects of C, and also by @option{-Wall}. The error can be downgraded > +to a warning using @option{-fpermissive} (along with certain other > +errors), or for this error alone, with > +@option{-Wno-error=implicit-function-declaration}. > > This warning is upgraded to an error by @option{-pedantic-errors}. > > diff --git a/gcc/testsuite/c-c++-common/spellcheck-reserved.c b/gcc/testsuite/c-c++-common/spellcheck-reserved.c > index 56e59dcc00a..0be35c56f52 100644 > --- a/gcc/testsuite/c-c++-common/spellcheck-reserved.c > +++ b/gcc/testsuite/c-c++-common/spellcheck-reserved.c > @@ -29,7 +29,7 @@ SOME_MACRO foo; /* { dg-bogus "__SOME_MACRO" } */ > void test (const char *buf, char ch) > { > __builtin_strtchr (buf, ch); /* { dg-line misspelled_reserved } */ > - /* { dg-warning "did you mean '__builtin_strchr'" "" { target c } misspelled_reserved } */ > + /* { dg-error "did you mean '__builtin_strchr'" "" { target c } misspelled_reserved } */ > /* { dg-error "'__builtin_strtchr' was not declared in this scope; did you mean '__builtin_strrchr'\\?" "" { target c++ } misspelled_reserved } */ > } > > @@ -38,7 +38,7 @@ void test (const char *buf, char ch) > void test_2 (const char *buf, char ch) > { > _builtin_strchr (buf, ch); /* { dg-line misspelled_one_underscore } */ > - /* { dg-warning "did you mean '__builtin_strchr'" "" { target c } misspelled_one_underscore } */ > + /* { dg-error "did you mean '__builtin_strchr'" "" { target c } misspelled_one_underscore } */ > /* { dg-error "'_builtin_strchr' was not declared in this scope; did you mean '__builtin_strchr'\\?" "" { target c++ } misspelled_one_underscore } */ > } > > diff --git a/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99-2.c b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99-2.c > new file mode 100644 > index 00000000000..d65abc9670c > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99-2.c > @@ -0,0 +1,7 @@ > +/* { dg-do compile } */ > +/* { dg-options "-std=c99" } */ > + > +void f(void) > +{ > + puts("Hello"); /* { dg-error "implicit declaration of function" } */ > +} > diff --git a/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99.c b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99.c > index 254f7e70e65..abea8a5f356 100644 > --- a/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99.c > +++ b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-std=c99" } */ > +/* { dg-options "-fpermissive -std=c99" } */ > > void f(void) > { > diff --git a/gcc/testsuite/gcc.dg/missing-header-fixit-1.c b/gcc/testsuite/gcc.dg/missing-header-fixit-1.c > index 2b28357e1db..eb33d9b1f23 100644 > --- a/gcc/testsuite/gcc.dg/missing-header-fixit-1.c > +++ b/gcc/testsuite/gcc.dg/missing-header-fixit-1.c > @@ -5,7 +5,7 @@ > /* This is padding (to avoid the generated patch containing DejaGnu > directives). */ > > -/* { dg-options "-fdiagnostics-generate-patch" } */ > +/* { dg-options "-fpermissive -fdiagnostics-generate-patch" } */ > > void test (int i, int j) > { > diff --git a/gcc/testsuite/gcc.dg/missing-header-fixit-1a.c b/gcc/testsuite/gcc.dg/missing-header-fixit-1a.c > new file mode 100644 > index 00000000000..e47236b955d > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/missing-header-fixit-1a.c > @@ -0,0 +1,37 @@ > +/* Example of a fix-it hint that adds a #include directive, > + adding them to the top of the file, given that there is no > + pre-existing #include. */ > + > +/* This is padding (to avoid the generated patch containing DejaGnu > + directives). */ > + > +/* { dg-options "-fdiagnostics-generate-patch" } */ > + > +void test (int i, int j) > +{ > + printf ("%i of %i\n", i, j); /* { dg-error "implicit declaration" } */ > + /* { dg-message "include '' or provide a declaration of 'printf'" "" { target *-*-* } .-1 } */ > + /* { dg-warning "incompatible implicit declaration of built-in function 'printf'" "" { target *-*-* } .-2 } */ > +} > + > +/* Verify the output from -fdiagnostics-generate-patch. > + We expect the patch to begin with a header, containing this > + source filename, via an absolute path. > + Given the path, we can only capture it via regexps. */ > +/* { dg-regexp "\\-\\-\\- .*" } */ > +/* { dg-regexp "\\+\\+\\+ .*" } */ > +/* Use #if 0/#endif rather than comments, to allow the text to contain > + a comment. */ > +#if 0 > +{ dg-begin-multiline-output "" } > +@@ -1,3 +1,4 @@ > ++#include > + /* Example of a fix-it hint that adds a #include directive, > + adding them to the top of the file, given that there is no > + pre-existing #include. */ > +{ dg-end-multiline-output "" } > +#endif > + > +/* FIXME: should we attempt to skip leading comments when determining the > + insertion location? > + Similarly, should we attempt to be within single-inclusion guards, etc? */ > diff --git a/gcc/testsuite/gcc.dg/missing-header-fixit-2.c b/gcc/testsuite/gcc.dg/missing-header-fixit-2.c > index 5d5f87488f5..38d36a66c46 100644 > --- a/gcc/testsuite/gcc.dg/missing-header-fixit-2.c > +++ b/gcc/testsuite/gcc.dg/missing-header-fixit-2.c > @@ -9,7 +9,7 @@ > /* { dg-warning "implicit declaration of function 'printf'" "" { target *-*-* } 6 } */ > /* { dg-warning "incompatible implicit declaration of built-in function 'printf'" "" { target *-*-* } 6 } */ > > -/* { dg-options "-fdiagnostics-generate-patch" } */ > +/* { dg-options "-fpermissive -fdiagnostics-generate-patch" } */ > > /* Verify the output from -fdiagnostics-generate-patch. > We expect the patch to begin with a header, containing the > diff --git a/gcc/testsuite/gcc.dg/missing-header-fixit-2a.c b/gcc/testsuite/gcc.dg/missing-header-fixit-2a.c > new file mode 100644 > index 00000000000..4ae617bddbd > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/missing-header-fixit-2a.c > @@ -0,0 +1,31 @@ > +/* Verify that when we suggest adding #include directives that they > + are added to the affected file. */ > + > +/* The following header file is missing a "#include ". */ > + > +#include "missing-header-fixit-2.h" > + > +/* These directives actually apply to the header. */ > +/* { dg-error "implicit declaration of function 'printf'" "" { target *-*-* } 6 } */ > +/* { dg-warning "incompatible implicit declaration of built-in function 'printf'" "" { target *-*-* } 6 } */ > + > +/* { dg-options "-fdiagnostics-generate-patch" } */ > + > +/* Verify the output from -fdiagnostics-generate-patch. > + We expect the patch to begin with a header, containing the > + filename of the header, via an absolute path. > + Given the path, we can only capture it via regexps. */ > +/* { dg-regexp "\\-\\-\\- .*" } */ > +/* { dg-regexp "\\+\\+\\+ .*" } */ > +/* Use #if 0/#endif rather than comments, to allow the text to contain > + a comment. > + We expect the *header* to have been patched, adding the missing include. */ > +#if 0 > +{ dg-begin-multiline-output "" } > +@@ -1,3 +1,4 @@ > ++#include > + /* This is missing-header-fixit-2.h, for use by > + missing-header-fixit-2.c */ > + > +{ dg-end-multiline-output "" } > +#endif > diff --git a/gcc/testsuite/gcc.dg/missing-header-fixit-4.c b/gcc/testsuite/gcc.dg/missing-header-fixit-4.c > index b6680563dc1..8e4e48d2e43 100644 > --- a/gcc/testsuite/gcc.dg/missing-header-fixit-4.c > +++ b/gcc/testsuite/gcc.dg/missing-header-fixit-4.c > @@ -3,7 +3,7 @@ > #include "empty.h" > int the_next_line; > > -/* { dg-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */ > +/* { dg-options "-fpermissive -fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */ > > void test (int i, int j) > { > diff --git a/gcc/testsuite/gcc.dg/missing-header-fixit-4a.c b/gcc/testsuite/gcc.dg/missing-header-fixit-4a.c > new file mode 100644 > index 00000000000..b93061f287b > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/missing-header-fixit-4a.c > @@ -0,0 +1,27 @@ > +/* Example of a fix-it hint that adds a #include directive, > + adding them after a pre-existing #include directive. */ > +#include "empty.h" > +int the_next_line; > + > +/* { dg-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */ > + > +void test (int i, int j) > +{ > + printf ("%i of %i\n", i, j); /* { dg-line printf } */ > + /* { dg-error "implicit declaration of function" "" { target *-*-* } printf } */ > + /* { dg-begin-multiline-output "" } > + 10 | printf ("%i of %i\n", i, j); > + | ^~~~~~ > + { dg-end-multiline-output "" } */ > + /* { dg-warning "incompatible implicit declaration" "" { target *-*-* } printf } */ > + /* { dg-begin-multiline-output "" } > + 10 | printf ("%i of %i\n", i, j); > + | ^~~~~~ > + { dg-end-multiline-output "" } */ > + /* { dg-message "include '' or provide a declaration of 'printf'" "" { target *-*-* } 4 } */ > + /* { dg-begin-multiline-output "" } > + 3 | #include "empty.h" > + +++ |+#include > + 4 | int the_next_line; > + { dg-end-multiline-output "" } */ > +} > diff --git a/gcc/testsuite/gcc.dg/missing-header-fixit-5.c b/gcc/testsuite/gcc.dg/missing-header-fixit-5.c > index bf44feb24a9..c34a47dc286 100644 > --- a/gcc/testsuite/gcc.dg/missing-header-fixit-5.c > +++ b/gcc/testsuite/gcc.dg/missing-header-fixit-5.c > @@ -3,7 +3,7 @@ > Rely on -Wimplicit-function-declaration for fixit hints, not on > -Wbuiltin-declaration-mismatch (which misses abs, isdigit, putchar). */ > > -/* { dg-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers -Wimplicit-function-declaration -Wno-builtin-declaration-mismatch" } */ > +/* { dg-options "-fpermissive -fdiagnostics-show-caret -fdiagnostics-show-line-numbers -Wimplicit-function-declaration -Wno-builtin-declaration-mismatch" } */ > > int > foo (char *m, int i) > diff --git a/gcc/testsuite/gcc.dg/missing-header-fixit-5a.c b/gcc/testsuite/gcc.dg/missing-header-fixit-5a.c > new file mode 100644 > index 00000000000..420cbf7be40 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/missing-header-fixit-5a.c > @@ -0,0 +1,42 @@ > + > +/* Forget to include any standard headers, all for built-in functions. > + Rely on -Wimplicit-function-declaration for fixit hints, not on > + -Wbuiltin-declaration-mismatch (which misses abs, isdigit, putchar). */ > + > +/* { dg-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers -Wimplicit-function-declaration -Wno-builtin-declaration-mismatch" } */ > + > +int > +foo (char *m, int i) > +{ > + if (isdigit (m[0])) /* { dg-error "implicit declaration of function" } */ > + /* { dg-begin-multiline-output "" } > + 11 | if (isdigit (m[0])) > + | ^~~~~~~ > + { dg-end-multiline-output "" } */ > + /* { dg-begin-multiline-output "" } > + +++ |+#include > + 1 | > + { dg-end-multiline-output "" } */ > + { > + return abs (i); /* { dg-error "implicit declaration of function" } */ > + /* { dg-begin-multiline-output "" } > + 21 | return abs (i); > + | ^~~ > + { dg-end-multiline-output "" } */ > + /* { dg-begin-multiline-output "" } > + +++ |+#include > + 1 | > + { dg-end-multiline-output "" } */ > + } > + else > + putchar (m[0]); /* { dg-error "implicit declaration of function" } */ > + /* { dg-begin-multiline-output "" } > + 32 | putchar (m[0]); > + | ^~~~~~~ > + { dg-end-multiline-output "" } */ > + /* { dg-begin-multiline-output "" } > + +++ |+#include > + 1 | > + { dg-end-multiline-output "" } */ > + return i; > +} > diff --git a/gcc/testsuite/gcc.dg/permerror-default.c b/gcc/testsuite/gcc.dg/permerror-default.c > index 5235a427175..f37f9189e41 100644 > --- a/gcc/testsuite/gcc.dg/permerror-default.c > +++ b/gcc/testsuite/gcc.dg/permerror-default.c > @@ -7,7 +7,7 @@ > void > implicit_function_declaration (void) > { > - f1 (); /* { dg-warning "'f1' \\\[-Wimplicit-function-declaration\\\]" } */ > + f1 (); /* { dg-error "'f1' \\\[-Wimplicit-function-declaration\\\]" } */ > } > > extern implicit_int_1; /* { dg-warning "'implicit_int_1' \\\[-Wimplicit-int\\\]" } */ > diff --git a/gcc/testsuite/gcc.dg/permerror-system.c b/gcc/testsuite/gcc.dg/permerror-system.c > index 75e08887ef1..e4da4a99e9a 100644 > --- a/gcc/testsuite/gcc.dg/permerror-system.c > +++ b/gcc/testsuite/gcc.dg/permerror-system.c > @@ -8,6 +8,8 @@ > > /* These errors come from permerror-default.c. */ > > +/* { dg-error "'f1' \\\[-Wimplicit-function-declaration\\\]" "" { target *-*-* } 10 } */ > + > /* { dg-error "pointer/integer type mismatch in conditional expression \\\[-Wint-conversion\\\]" "" { target *-*-* } 29 } */ > /* { dg-error "pointer/integer type mismatch in conditional expression \\\[-Wint-conversion\\\]" "" { target *-*-* } 30 } */ > /* { dg-error "passing argument 1 of 'f2' makes pointer from integer without a cast \\\[-Wint-conversion\\\]" "" { target *-*-* } 31 } */ > diff --git a/gcc/testsuite/gcc.dg/pr61852.c b/gcc/testsuite/gcc.dg/pr61852.c > index f488aca7ac2..e669d3c4d39 100644 > --- a/gcc/testsuite/gcc.dg/pr61852.c > +++ b/gcc/testsuite/gcc.dg/pr61852.c > @@ -1,10 +1,10 @@ > /* PR c/61852 */ > /* { dg-do compile } */ > -/* { dg-options "-Wimplicit-function-declaration" } */ > +/* { dg-options "" } */ > > int > f (int a) > { > - int b = a + a + a + ff (a); /* { dg-warning "23:implicit declaration of function" } */ > + int b = a + a + a + ff (a); /* { dg-error "23:implicit declaration of function" } */ > return b; > } > diff --git a/gcc/testsuite/gcc.dg/spellcheck-identifiers-1a.c b/gcc/testsuite/gcc.dg/spellcheck-identifiers-1a.c > new file mode 100644 > index 00000000000..f50c52b656c > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/spellcheck-identifiers-1a.c > @@ -0,0 +1,136 @@ > +/* { dg-do compile } */ > +/* { dg-options "-fdiagnostics-show-caret" } */ > + > +typedef struct GtkWidget { int dummy; } GtkWidget; > + > +extern void gtk_widget_show_all (GtkWidget *w); > + > +void > +test_1 (GtkWidget *w) > +{ > + gtk_widget_showall (w); /* { dg-error "3: implicit declaration of function .gtk_widget_showall.; did you mean .gtk_widget_show_all.?" } */ > + /* { dg-begin-multiline-output "" } > + gtk_widget_showall (w); > + ^~~~~~~~~~~~~~~~~~ > + gtk_widget_show_all > + { dg-end-multiline-output "" } */ > + > + /* Ensure we don't try to suggest "gtk_widget_showall" for subsequent > + corrections. */ > + gtk_widget_showall_ (w); /* { dg-error "3: implicit declaration of function .gtk_widget_showall_.; did you mean .gtk_widget_show_all.?" } */ > + /* { dg-begin-multiline-output "" } > + gtk_widget_showall_ (w); > + ^~~~~~~~~~~~~~~~~~~ > + gtk_widget_show_all > + { dg-end-multiline-output "" } */ > + > + GtkWidgetShowAll (w); /* { dg-error "3: implicit declaration of function .GtkWidgetShowAll.; did you mean .gtk_widget_show_all.?" } */ > + /* { dg-begin-multiline-output "" } > + GtkWidgetShowAll (w); > + ^~~~~~~~~~~~~~~~ > + gtk_widget_show_all > + { dg-end-multiline-output "" } */ > +} > + > +int > +test_2 (int param) > +{ > + return parma * parma; /* { dg-error "10: .parma. undeclared .first use in this function.; did you mean .param." } */ > + /* { dg-begin-multiline-output "" } > + return parma * parma; > + ^~~~~ > + param > + { dg-end-multiline-output "" } */ > +} > + > +#define MACRO(X) ((X)) > + > +int > +test_3 (int i) > +{ > + return MACRAME (i); /* { dg-error "10: implicit declaration of function .MACRAME.; did you mean .MACRO.?" } */ > + /* { dg-begin-multiline-output "" } > + return MACRAME (i); > + ^~~~~~~ > + MACRO > + { dg-end-multiline-output "" } */ > +} > + > +#define IDENTIFIER_POINTER(X) ((X)) > + > +int > +test_4 (int node) > +{ > + return IDENTIFIER_PTR (node); /* { dg-error "10: implicit declaration of function .IDENTIFIER_PTR.; did you mean .IDENTIFIER_POINTER.?" } */ > + /* { dg-begin-multiline-output "" } > + return IDENTIFIER_PTR (node); > + ^~~~~~~~~~~~~~ > + IDENTIFIER_POINTER > + { dg-end-multiline-output "" } */ > +} > + > + > +int > +test_5 (void) > +{ > + return __LINE_; /* { dg-error "10: .__LINE_. undeclared .first use in this function.; did you mean .__LINE__." } */ > + /* { dg-begin-multiline-output "" } > + return __LINE_; > + ^~~~~~~ > + __LINE__ > + { dg-end-multiline-output "" } */ > +} > + > +#define MAX_ITEMS 100 > +int array[MAX_ITEM]; /* { dg-error "11: .MAX_ITEM. undeclared here .not in a function.; did you mean .MAX_ITEMS." } */ > + /* { dg-begin-multiline-output "" } > + int array[MAX_ITEM]; > + ^~~~~~~~ > + MAX_ITEMS > + { dg-end-multiline-output "" } */ > + > + > +enum foo { > + FOO_FIRST, > + FOO_SECOND > +}; > + > +int > +test_6 (enum foo f) > +{ > + switch (f) > + { > + case FOO_FURST: /* { dg-error "10: .FOO_FURST. undeclared .first use in this function.; did you mean .FOO_FIRST." } */ > + break; > + /* { dg-begin-multiline-output "" } > + case FOO_FURST: > + ^~~~~~~~~ > + FOO_FIRST > + { dg-end-multiline-output "" } */ > + > + case FOO_SECCOND: /* { dg-error "10: .FOO_SECCOND. undeclared .first use in this function.; did you mean .FOO_SECOND." } */ > + break; > + /* { dg-begin-multiline-output "" } > + case FOO_SECCOND: > + ^~~~~~~~~~~ > + FOO_SECOND > + { dg-end-multiline-output "" } */ > + > + default: > + break; > + } > +} > + > +int snprintf (char *, __SIZE_TYPE__, const char *, ...); > + > +void > +test_7 (int i, int j) > +{ > + int buffer[100]; > + snprint (buffer, 100, "%i of %i", i, j); /* { dg-error "3: implicit declaration of function .snprint.; did you mean .snprintf.." } */ > + /* { dg-begin-multiline-output "" } > + snprint (buffer, 100, "%i of %i", i, j); > + ^~~~~~~ > + snprintf > + { dg-end-multiline-output "" } */ > +} > diff --git a/gcc/testsuite/gcc.dg/spellcheck-identifiers-2.c b/gcc/testsuite/gcc.dg/spellcheck-identifiers-2.c > index ad6e9d3191d..b49709dc528 100644 > --- a/gcc/testsuite/gcc.dg/spellcheck-identifiers-2.c > +++ b/gcc/testsuite/gcc.dg/spellcheck-identifiers-2.c > @@ -1,7 +1,7 @@ > /* PR c/71858 */ > /* Make sure anticipated builtins are not considered before they are declared. */ > /* { dg-do compile } */ > -/* { dg-options "-Wimplicit-function-declaration -fdiagnostics-show-caret" } */ > +/* { dg-options "-fpermissive -Wimplicit-function-declaration -fdiagnostics-show-caret" } */ > > int sscafn (const char *, const char *, ...); > > diff --git a/gcc/testsuite/gcc.dg/spellcheck-identifiers-2a.c b/gcc/testsuite/gcc.dg/spellcheck-identifiers-2a.c > new file mode 100644 > index 00000000000..1a3e68c703c > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/spellcheck-identifiers-2a.c > @@ -0,0 +1,33 @@ > +/* PR c/71858 */ > +/* Make sure anticipated builtins are not considered before they are declared. */ > +/* { dg-do compile } */ > +/* { dg-options "-fdiagnostics-show-caret" } */ > + > +int sscafn (const char *, const char *, ...); > + > +int > +test_1 (const char *p) > +{ > + int i; > + return ssacnf (p, "%d", &i); /* { dg-error "10: implicit declaration of function .ssacnf.; did you mean .sscafn.?" } */ > + /* { dg-begin-multiline-output "" } > + return ssacnf (p, "%d", &i); > + ^~~~~~ > + sscafn > + { dg-end-multiline-output "" } */ > +} > + > +int scafn (const char *, ...); > +int scanf (const char *, ...); > + > +int > +test_2 (void) > +{ > + int i; > + return sacnf ("%d", &i); /* { dg-error "10: implicit declaration of function .sacnf.; did you mean .scanf.?" } */ > + /* { dg-begin-multiline-output "" } > + return sacnf ("%d", &i); > + ^~~~~ > + scanf > + { dg-end-multiline-output "" } */ > +} > diff --git a/gcc/testsuite/gcc.dg/spellcheck-identifiers-3.c b/gcc/testsuite/gcc.dg/spellcheck-identifiers-3.c > index 94f4078d0e8..0b5982fa705 100644 > --- a/gcc/testsuite/gcc.dg/spellcheck-identifiers-3.c > +++ b/gcc/testsuite/gcc.dg/spellcheck-identifiers-3.c > @@ -1,7 +1,7 @@ > /* PR c/71858 */ > /* Only consider function names, function pointers and macros for implicit function declarations. */ > /* { dg-do compile } */ > -/* { dg-options "-Wimplicit-function-declaration -fdiagnostics-show-caret" } */ > +/* { dg-options "-fpermissive -Wimplicit-function-declaration -fdiagnostics-show-caret" } */ > > void fn1abcd (void); > > diff --git a/gcc/testsuite/gcc.dg/spellcheck-identifiers-3a.c b/gcc/testsuite/gcc.dg/spellcheck-identifiers-3a.c > new file mode 100644 > index 00000000000..0c0a19e547b > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/spellcheck-identifiers-3a.c > @@ -0,0 +1,45 @@ > +/* PR c/71858 */ > +/* Only consider function names, function pointers and macros for implicit function declarations. */ > +/* { dg-do compile } */ > +/* { dg-options "-fdiagnostics-show-caret" } */ > + > +void fn1abcd (void); > + > +void > +test_1 (int fn1bacd) > +{ > + fn1badc (); /* { dg-error "3: implicit declaration of function .fn1badc.; did you mean .fn1abcd.?" } */ > + /* { dg-begin-multiline-output "" } > + fn1badc (); > + ^~~~~~~ > + fn1abcd > + { dg-end-multiline-output "" } */ > +} > + > +void fn2efgh (void); > +void (*fn2efhg) (void); > + > +void > +test_2 (void) > +{ > + fn2fehg (); /* { dg-error "3: implicit declaration of function .fn2fehg.; did you mean .fn2efhg.?" } */ > + /* { dg-begin-multiline-output "" } > + fn2fehg (); > + ^~~~~~~ > + fn2efhg > + { dg-end-multiline-output "" } */ > +} > + > +void fn3ijkl (void); > +typedef int fn3ijlk; > + > +void > +test_3 (void) > +{ > + fn3jilk (); /* { dg-error "3: implicit declaration of function .fn3jilk.; did you mean .fn3ijkl.?" } */ > + /* { dg-begin-multiline-output "" } > + fn3jilk (); > + ^~~~~~~ > + fn3ijkl > + { dg-end-multiline-output "" } */ > +} > diff --git a/gcc/testsuite/gcc.dg/spellcheck-identifiers-4.c b/gcc/testsuite/gcc.dg/spellcheck-identifiers-4.c > index f9b7d8d0cab..f24d863a15c 100644 > --- a/gcc/testsuite/gcc.dg/spellcheck-identifiers-4.c > +++ b/gcc/testsuite/gcc.dg/spellcheck-identifiers-4.c > @@ -1,4 +1,4 @@ > -/* { dg-options "-Wimplicit-function-declaration" } */ > +/* { dg-options "-fpermissive -Wimplicit-function-declaration" } */ > > extern double sqrt (double); > > diff --git a/gcc/testsuite/gcc.dg/spellcheck-identifiers-4a.c b/gcc/testsuite/gcc.dg/spellcheck-identifiers-4a.c > new file mode 100644 > index 00000000000..33a6b4220f4 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/spellcheck-identifiers-4a.c > @@ -0,0 +1,10 @@ > +/* { dg-options "" } */ > + > +extern double sqrt (double); > + > +void test (float pf, float inff) > +{ > + assert (pf == inff); /* { dg-bogus "sqrt" } */ > + /* { dg-error "implicit declaration of function 'assert'" "" { target *-*-* } .-1 } */ > + /* { dg-message "header ''" "" { target *-*-* } .-2 } */ > +} > diff --git a/gcc/testsuite/gcc.dg/spellcheck-identifiers.c b/gcc/testsuite/gcc.dg/spellcheck-identifiers.c > index 063e3f9eda1..cd632c6a064 100644 > --- a/gcc/testsuite/gcc.dg/spellcheck-identifiers.c > +++ b/gcc/testsuite/gcc.dg/spellcheck-identifiers.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-Wimplicit-function-declaration -fdiagnostics-show-caret" } */ > +/* { dg-options "-fpermissive -fdiagnostics-show-caret" } */ > > typedef struct GtkWidget { int dummy; } GtkWidget; > > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ld1sh_gather_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ld1sh_gather_1.c > index 91f37f6a53d..c9f49b6e73d 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ld1sh_gather_1.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ld1sh_gather_1.c > @@ -11,7 +11,7 @@ f1 (svbool_t pg, short *s16_ptr, unsigned short *u16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svld1sh_gather_index (pg, s16_ptr, s32); /* { dg-warning {implicit declaration of function 'svld1sh_gather_index'; did you mean 'svld1_gather_index'} } */ > + svld1sh_gather_index (pg, s16_ptr, s32); /* { dg-error {implicit declaration of function 'svld1sh_gather_index'; did you mean 'svld1_gather_index'} } */ > svld1sh_gather_index_u32 (pg, s16_ptr); /* { dg-error {too few arguments to function 'svld1sh_gather_index_u32'} } */ > svld1sh_gather_index_u32 (pg, s16_ptr, s32, 0); /* { dg-error {too many arguments to function 'svld1sh_gather_index_u32'} } */ > svld1sh_gather_index_u32 (pg, u16_ptr, s32); /* { dg-warning {pointer targets in passing argument 2 of 'svld1sh_gather_s32index_u32' differ in signedness} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_1.c > index 91f37f6a53d..c9f49b6e73d 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_1.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_1.c > @@ -11,7 +11,7 @@ f1 (svbool_t pg, short *s16_ptr, unsigned short *u16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svld1sh_gather_index (pg, s16_ptr, s32); /* { dg-warning {implicit declaration of function 'svld1sh_gather_index'; did you mean 'svld1_gather_index'} } */ > + svld1sh_gather_index (pg, s16_ptr, s32); /* { dg-error {implicit declaration of function 'svld1sh_gather_index'; did you mean 'svld1_gather_index'} } */ > svld1sh_gather_index_u32 (pg, s16_ptr); /* { dg-error {too few arguments to function 'svld1sh_gather_index_u32'} } */ > svld1sh_gather_index_u32 (pg, s16_ptr, s32, 0); /* { dg-error {too many arguments to function 'svld1sh_gather_index_u32'} } */ > svld1sh_gather_index_u32 (pg, u16_ptr, s32); /* { dg-warning {pointer targets in passing argument 2 of 'svld1sh_gather_s32index_u32' differ in signedness} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_restricted_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_restricted_1.c > index c47e5411c20..a2dcf9a041b 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_restricted_1.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_restricted_1.c > @@ -13,7 +13,7 @@ f1 (svbool_t pg, short *s16_ptr, unsigned short *u16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svldnt1sh_gather_index (pg, s16_ptr, s64); /* { dg-warning {implicit declaration of function 'svldnt1sh_gather_index'; did you mean 'svldnt1_gather_index'} } */ > + svldnt1sh_gather_index (pg, s16_ptr, s64); /* { dg-error {implicit declaration of function 'svldnt1sh_gather_index'; did you mean 'svldnt1_gather_index'} } */ > svldnt1sh_gather_index_u64 (pg, s16_ptr); /* { dg-error {too few arguments to function 'svldnt1sh_gather_index_u64'} } */ > svldnt1sh_gather_index_u64 (pg, s16_ptr, s64, 0); /* { dg-error {too many arguments to function 'svldnt1sh_gather_index_u64'} } */ > svldnt1sh_gather_index_u64 (pg, u16_ptr, s64); /* { dg-warning {pointer targets in passing argument 2 of 'svldnt1sh_gather_s64index_u64' differ in signedness} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_1.c > index dae4d0ce120..cd849f89941 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_1.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_1.c > @@ -11,7 +11,7 @@ f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svld1sb_gather_offset (pg, s8_ptr, s32); /* { dg-warning {implicit declaration of function 'svld1sb_gather_offset'; did you mean 'svld1_gather_offset'} } */ > + svld1sb_gather_offset (pg, s8_ptr, s32); /* { dg-error {implicit declaration of function 'svld1sb_gather_offset'; did you mean 'svld1_gather_offset'} } */ > svld1sb_gather_offset_s32 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svld1sb_gather_offset_s32'} } */ > svld1sb_gather_offset_s32 (pg, s8_ptr, s32, 0); /* { dg-error {too many arguments to function 'svld1sb_gather_offset_s32'} } */ > svld1sb_gather_offset_s32 (pg, s16_ptr, s32); /* { dg-warning {passing argument 2 of 'svld1sb_gather_s32offset_s32' from incompatible pointer type} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_2.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_2.c > index 1bc66977cdf..850eecf99f6 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_2.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_2.c > @@ -11,7 +11,7 @@ f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svld1sb_gather_offset (pg, s8_ptr, s32); /* { dg-warning {implicit declaration of function 'svld1sb_gather_offset'; did you mean 'svld1_gather_offset'} } */ > + svld1sb_gather_offset (pg, s8_ptr, s32); /* { dg-error {implicit declaration of function 'svld1sb_gather_offset'; did you mean 'svld1_gather_offset'} } */ > svld1sb_gather_offset_u32 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svld1sb_gather_offset_u32'} } */ > svld1sb_gather_offset_u32 (pg, s8_ptr, s32, 0); /* { dg-error {too many arguments to function 'svld1sb_gather_offset_u32'} } */ > svld1sb_gather_offset_u32 (pg, s16_ptr, s32); /* { dg-warning {passing argument 2 of 'svld1sb_gather_s32offset_u32' from incompatible pointer type} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_3.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_3.c > index 6522889dbe7..93a728593f9 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_3.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_3.c > @@ -11,7 +11,7 @@ f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svld1sb_gather_offset (pg, s8_ptr, s64); /* { dg-warning {implicit declaration of function 'svld1sb_gather_offset'; did you mean 'svld1_gather_offset'} } */ > + svld1sb_gather_offset (pg, s8_ptr, s64); /* { dg-error {implicit declaration of function 'svld1sb_gather_offset'; did you mean 'svld1_gather_offset'} } */ > svld1sb_gather_offset_s64 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svld1sb_gather_offset_s64'} } */ > svld1sb_gather_offset_s64 (pg, s8_ptr, s64, 0); /* { dg-error {too many arguments to function 'svld1sb_gather_offset_s64'} } */ > svld1sb_gather_offset_s64 (pg, s16_ptr, s64); /* { dg-warning {passing argument 2 of 'svld1sb_gather_s64offset_s64' from incompatible pointer type} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_4.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_4.c > index 02562198909..d54dc8eafab 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_4.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_4.c > @@ -11,7 +11,7 @@ f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svld1sb_gather_offset (pg, s8_ptr, s64); /* { dg-warning {implicit declaration of function 'svld1sb_gather_offset'; did you mean 'svld1_gather_offset'} } */ > + svld1sb_gather_offset (pg, s8_ptr, s64); /* { dg-error {implicit declaration of function 'svld1sb_gather_offset'; did you mean 'svld1_gather_offset'} } */ > svld1sb_gather_offset_u64 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svld1sb_gather_offset_u64'} } */ > svld1sb_gather_offset_u64 (pg, s8_ptr, s64, 0); /* { dg-error {too many arguments to function 'svld1sb_gather_offset_u64'} } */ > svld1sb_gather_offset_u64 (pg, s16_ptr, s64); /* { dg-warning {passing argument 2 of 'svld1sb_gather_s64offset_u64' from incompatible pointer type} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_5.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_5.c > index 8d57aa020ea..3b521d5c141 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_5.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_5.c > @@ -11,7 +11,7 @@ f1 (svbool_t pg, unsigned char *s8_ptr, unsigned short *s16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svld1ub_gather_offset (pg, s8_ptr, s32); /* { dg-warning {implicit declaration of function 'svld1ub_gather_offset'; did you mean 'svld1_gather_offset'} } */ > + svld1ub_gather_offset (pg, s8_ptr, s32); /* { dg-error {implicit declaration of function 'svld1ub_gather_offset'; did you mean 'svld1_gather_offset'} } */ > svld1ub_gather_offset_s32 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svld1ub_gather_offset_s32'} } */ > svld1ub_gather_offset_s32 (pg, s8_ptr, s32, 0); /* { dg-error {too many arguments to function 'svld1ub_gather_offset_s32'} } */ > svld1ub_gather_offset_s32 (pg, s16_ptr, s32); /* { dg-warning {passing argument 2 of 'svld1ub_gather_s32offset_s32' from incompatible pointer type} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c > index 353fec2d39d..96d8ad55074 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c > @@ -13,7 +13,7 @@ f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svldnt1sb_gather_offset (pg, s8_ptr, s32); /* { dg-warning {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */ > + svldnt1sb_gather_offset (pg, s8_ptr, s32); /* { dg-error {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */ > svldnt1sb_gather_offset_s32 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svldnt1sb_gather_offset_s32'} } */ > svldnt1sb_gather_offset_s32 (pg, s8_ptr, u32, 0); /* { dg-error {too many arguments to function 'svldnt1sb_gather_offset_s32'} } */ > svldnt1sb_gather_offset_s32 (pg, s16_ptr, u32); /* { dg-warning {passing argument 2 of 'svldnt1sb_gather_u32offset_s32' from incompatible pointer type} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c > index e22b3dd8fea..25ce7268a1e 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c > @@ -13,7 +13,7 @@ f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svldnt1sb_gather_offset (pg, s8_ptr, s32); /* { dg-warning {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */ > + svldnt1sb_gather_offset (pg, s8_ptr, s32); /* { dg-error {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */ > svldnt1sb_gather_offset_u32 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svldnt1sb_gather_offset_u32'} } */ > svldnt1sb_gather_offset_u32 (pg, s8_ptr, u32, 0); /* { dg-error {too many arguments to function 'svldnt1sb_gather_offset_u32'} } */ > svldnt1sb_gather_offset_u32 (pg, s16_ptr, u32); /* { dg-warning {passing argument 2 of 'svldnt1sb_gather_u32offset_u32' from incompatible pointer type} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c > index 73b5715c368..04465f251b1 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c > @@ -13,7 +13,7 @@ f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svldnt1sb_gather_offset (pg, s8_ptr, s64); /* { dg-warning {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */ > + svldnt1sb_gather_offset (pg, s8_ptr, s64); /* { dg-error {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */ > svldnt1sb_gather_offset_s64 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svldnt1sb_gather_offset_s64'} } */ > svldnt1sb_gather_offset_s64 (pg, s8_ptr, s64, 0); /* { dg-error {too many arguments to function 'svldnt1sb_gather_offset_s64'} } */ > svldnt1sb_gather_offset_s64 (pg, s16_ptr, s64); /* { dg-warning {passing argument 2 of 'svldnt1sb_gather_s64offset_s64' from incompatible pointer type} } */ > diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c > index e2ceb18bc42..479be66996d 100644 > --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c > +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c > @@ -13,7 +13,7 @@ f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr, > svint32_t s32, svuint32_t u32, svfloat32_t f32, > svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s) > { > - svldnt1sb_gather_offset (pg, s8_ptr, s64); /* { dg-warning {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */ > + svldnt1sb_gather_offset (pg, s8_ptr, s64); /* { dg-error {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */ > svldnt1sb_gather_offset_u64 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svldnt1sb_gather_offset_u64'} } */ > svldnt1sb_gather_offset_u64 (pg, s8_ptr, s64, 0); /* { dg-error {too many arguments to function 'svldnt1sb_gather_offset_u64'} } */ > svldnt1sb_gather_offset_u64 (pg, s16_ptr, s64); /* { dg-warning {passing argument 2 of 'svldnt1sb_gather_s64offset_u64' from incompatible pointer type} } */ > -- > 2.42.0 > > Marek