[clang] fix bug that undefined internal is a warning only for -pedantic-errors (PR #98016)

Constantin Kronbichler via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 11 01:18:32 PDT 2024


https://github.com/ccrownhill updated https://github.com/llvm/llvm-project/pull/98016

>From 5dd2bb12dee26ba93d927ad1cd99fa610f9ace97 Mon Sep 17 00:00:00 2001
From: ccrownhill <ckronbichler at proton.me>
Date: Mon, 8 Jul 2024 11:42:37 +0100
Subject: [PATCH 1/4] fix bug that undefined internal is a warning only for
 -pedantic-errors

---
 clang/include/clang/Basic/DiagnosticSemaKinds.td |  2 +-
 clang/test/Sema/undefined_internal.c             | 11 +++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/undefined_internal.c

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 44fd51ec9abc9..ae3dbedd01693 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -6013,7 +6013,7 @@ def note_deleted_assign_field : Note<
   "because field %2 is of %select{reference|const-qualified}4 type %3">;
 
 // These should be errors.
-def warn_undefined_internal : Warning<
+def warn_undefined_internal : ExtWarn<
   "%select{function|variable}0 %q1 has internal linkage but is not defined">,
   InGroup<DiagGroup<"undefined-internal">>;
 def err_undefined_internal_type : Error<
diff --git a/clang/test/Sema/undefined_internal.c b/clang/test/Sema/undefined_internal.c
new file mode 100644
index 0000000000000..1b6c3a4b76e05
--- /dev/null
+++ b/clang/test/Sema/undefined_internal.c
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic-errors
+
+static void f(void); // expected-error {{function 'f' has internal linkage but is not defined}}
+
+int main(void)
+{
+    f;
+    // expected-note at -1 {{used here}}
+    // expected-warning at -2 {{expression result unused}}
+}
+

>From 9e679ac9c2c669b595d361516b7e499e0b0457ba Mon Sep 17 00:00:00 2001
From: ccrownhill <ckronbichler at proton.me>
Date: Wed, 10 Jul 2024 12:06:28 +0100
Subject: [PATCH 2/4] add to change of undefined_internal to error for
 -pedantic-errors to release notes

---
 clang/docs/ReleaseNotes.rst | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 838cb69f647ee..a4146aeee25de 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -554,6 +554,9 @@ Attribute Changes in Clang
 
 Improvements to Clang's diagnostics
 -----------------------------------
+- Clang now emits an error instead of a warning for `undefined_internal`
+  when compiling with `-pedantic-errors` to conform to the C standard
+
 - Clang now applies syntax highlighting to the code snippets it
   prints.
 

>From b553d87a675cac5d60df2b1fdc586d6b7af6b687 Mon Sep 17 00:00:00 2001
From: ccrownhill <ckronbichler at proton.me>
Date: Wed, 10 Jul 2024 19:04:17 +0200
Subject: [PATCH 3/4] add more tests for undefined internals

---
 ...undefined_internal.c => undefined-internal-basic.c} |  0
 clang/test/Sema/undefined-internal-generic-selection.c | 10 ++++++++++
 clang/test/Sema/undefined-internal-sizeof.c            | 10 ++++++++++
 clang/test/Sema/undefined-internal-typeof.c            | 10 ++++++++++
 4 files changed, 30 insertions(+)
 rename clang/test/Sema/{undefined_internal.c => undefined-internal-basic.c} (100%)
 create mode 100644 clang/test/Sema/undefined-internal-generic-selection.c
 create mode 100644 clang/test/Sema/undefined-internal-sizeof.c
 create mode 100644 clang/test/Sema/undefined-internal-typeof.c

diff --git a/clang/test/Sema/undefined_internal.c b/clang/test/Sema/undefined-internal-basic.c
similarity index 100%
rename from clang/test/Sema/undefined_internal.c
rename to clang/test/Sema/undefined-internal-basic.c
diff --git a/clang/test/Sema/undefined-internal-generic-selection.c b/clang/test/Sema/undefined-internal-generic-selection.c
new file mode 100644
index 0000000000000..0a2b4b61e68e7
--- /dev/null
+++ b/clang/test/Sema/undefined-internal-generic-selection.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic-errors
+
+// expected-no-diagnostics
+
+static int f(void);
+
+int main(void)
+{
+    int x = _Generic(f(), int: 10, short: 20);
+}
diff --git a/clang/test/Sema/undefined-internal-sizeof.c b/clang/test/Sema/undefined-internal-sizeof.c
new file mode 100644
index 0000000000000..f609473b1341c
--- /dev/null
+++ b/clang/test/Sema/undefined-internal-sizeof.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic-errors
+
+// expected-no-diagnostics
+
+static int f(void);
+
+int main(void)
+{
+    int x = sizeof f();
+}
diff --git a/clang/test/Sema/undefined-internal-typeof.c b/clang/test/Sema/undefined-internal-typeof.c
new file mode 100644
index 0000000000000..51c682ef7e942
--- /dev/null
+++ b/clang/test/Sema/undefined-internal-typeof.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c23 -pedantic-errors
+
+// expected-no-diagnostics
+
+static int f(void);
+
+int main(void)
+{
+    typeof(f()) x;
+}

>From 72a5f4084167b9c1930adbd3756450e5e908b674 Mon Sep 17 00:00:00 2001
From: ccrownhill <ckronbichler at proton.me>
Date: Thu, 11 Jul 2024 10:17:58 +0200
Subject: [PATCH 4/4] cover alignof as well as illegal _Generic case for
 undefined_internal error test

---
 clang/test/Sema/undefined-internal-alignof.c           | 10 ++++++++++
 clang/test/Sema/undefined-internal-generic-selection.c | 10 ++++++----
 ...ternal-typeof.c => undefined-internal-typeof-c23.c} |  0
 3 files changed, 16 insertions(+), 4 deletions(-)
 create mode 100644 clang/test/Sema/undefined-internal-alignof.c
 rename clang/test/Sema/{undefined-internal-typeof.c => undefined-internal-typeof-c23.c} (100%)

diff --git a/clang/test/Sema/undefined-internal-alignof.c b/clang/test/Sema/undefined-internal-alignof.c
new file mode 100644
index 0000000000000..7083857b67cf9
--- /dev/null
+++ b/clang/test/Sema/undefined-internal-alignof.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic-errors
+
+static void f(void); // expected-no-error
+
+int main(void)
+{
+    int i = _Alignof(f);
+    // expected-error at -1 {{'_Alignof' applied to an expression is a GNU extension}}
+    // expected-error at -2 {{invalid application of 'alignof' to a function type}}
+}
diff --git a/clang/test/Sema/undefined-internal-generic-selection.c b/clang/test/Sema/undefined-internal-generic-selection.c
index 0a2b4b61e68e7..db5e33fff769b 100644
--- a/clang/test/Sema/undefined-internal-generic-selection.c
+++ b/clang/test/Sema/undefined-internal-generic-selection.c
@@ -1,10 +1,12 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s -pedantic-errors
 
-// expected-no-diagnostics
-
-static int f(void);
+static void *f(void); // expected-error {{function 'f' has internal linkage but is not defined}}
 
 int main(void)
 {
-    int x = _Generic(f(), int: 10, short: 20);
+    int j = _Generic(&f, void *(*)(void): 10, default: 20);
+    // expected-no-diagnostic at -1
+
+    void *k = _Generic(&f, void *(*)(void): f(), default: 20);
+    // expected-note at -1 {{used here}}
 }
diff --git a/clang/test/Sema/undefined-internal-typeof.c b/clang/test/Sema/undefined-internal-typeof-c23.c
similarity index 100%
rename from clang/test/Sema/undefined-internal-typeof.c
rename to clang/test/Sema/undefined-internal-typeof-c23.c



More information about the cfe-commits mailing list