[clang] C89 doesn't have `math.h` functions (PR #129979)

Vinay Deshmukh via cfe-commits cfe-commits at lists.llvm.org
Sun Mar 9 11:15:11 PDT 2025


https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/129979

>From e9c7869550d9fd1eba4d4d42ee644540e6b6d445 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Tue, 4 Mar 2025 22:30:34 -0500
Subject: [PATCH 1/5] add failing test

---
 clang/test/C/drs/c89_with_c99_functions.c | 7 +++++++
 1 file changed, 7 insertions(+)
 create mode 100644 clang/test/C/drs/c89_with_c99_functions.c

diff --git a/clang/test/C/drs/c89_with_c99_functions.c b/clang/test/C/drs/c89_with_c99_functions.c
new file mode 100644
index 0000000000000..d848727001562
--- /dev/null
+++ b/clang/test/C/drs/c89_with_c99_functions.c
@@ -0,0 +1,7 @@
+// RUN: %clang_cc1 -std=c89 -verify %s
+
+// From: https://github.com/llvm/llvm-project/issues/15522#issue-1071059939
+int logf = 5;
+int main() {
+return logf;
+}

>From 966aa6a735722063d7ea9727e36136f4f39c3d88 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Wed, 5 Mar 2025 22:09:02 -0500
Subject: [PATCH 2/5] Update test to `expect-no-diagnostics`

---
 clang/test/C/drs/c89_with_c99_functions.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/clang/test/C/drs/c89_with_c99_functions.c b/clang/test/C/drs/c89_with_c99_functions.c
index d848727001562..de525313fbba5 100644
--- a/clang/test/C/drs/c89_with_c99_functions.c
+++ b/clang/test/C/drs/c89_with_c99_functions.c
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -std=c89 -verify %s
+// expected-no-diagnostics
 
 // From: https://github.com/llvm/llvm-project/issues/15522#issue-1071059939
 int logf = 5;

>From 28c58718d76be9c62635cdeffebc9d812b192e50 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Wed, 5 Mar 2025 22:13:50 -0500
Subject: [PATCH 3/5] Add exclusion for C89 / math.h functions

---
 clang/lib/Basic/Builtins.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp
index e7829a461bbc5..cfcbefdce2a24 100644
--- a/clang/lib/Basic/Builtins.cpp
+++ b/clang/lib/Basic/Builtins.cpp
@@ -14,6 +14,7 @@
 #include "BuiltinTargetFeatures.h"
 #include "clang/Basic/IdentifierTable.h"
 #include "clang/Basic/LangOptions.h"
+#include "clang/Basic/LangStandard.h"
 #include "clang/Basic/TargetInfo.h"
 #include "llvm/ADT/StringRef.h"
 using namespace clang;
@@ -148,7 +149,7 @@ static bool builtinIsSupported(const llvm::StringTable &Strings,
   if (!LangOpts.Coroutines && (BuiltinInfo.Langs & COR_LANG))
     return false;
   /* MathBuiltins Unsupported */
-  if (LangOpts.NoMathBuiltin && BuiltinInfo.Header.ID == HeaderDesc::MATH_H)
+  if ((LangOpts.NoMathBuiltin || /*C89*/ LangOpts.LangStd == LangStandard::lang_c89)&& BuiltinInfo.Header.ID == HeaderDesc::MATH_H)
     return false;
   /* GnuMode Unsupported */
   if (!LangOpts.GNUMode && (BuiltinInfo.Langs & GNU_LANG))

>From 6e790580b3859cd68ca6ea87c1601979047310ab Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Wed, 5 Mar 2025 22:25:07 -0500
Subject: [PATCH 4/5] clang-format

---
 clang/lib/Basic/Builtins.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp
index cfcbefdce2a24..81f85bb5454e4 100644
--- a/clang/lib/Basic/Builtins.cpp
+++ b/clang/lib/Basic/Builtins.cpp
@@ -149,7 +149,9 @@ static bool builtinIsSupported(const llvm::StringTable &Strings,
   if (!LangOpts.Coroutines && (BuiltinInfo.Langs & COR_LANG))
     return false;
   /* MathBuiltins Unsupported */
-  if ((LangOpts.NoMathBuiltin || /*C89*/ LangOpts.LangStd == LangStandard::lang_c89)&& BuiltinInfo.Header.ID == HeaderDesc::MATH_H)
+  if ((LangOpts.NoMathBuiltin ||
+       /*C89*/ LangOpts.LangStd == LangStandard::lang_c89) &&
+      BuiltinInfo.Header.ID == HeaderDesc::MATH_H)
     return false;
   /* GnuMode Unsupported */
   if (!LangOpts.GNUMode && (BuiltinInfo.Langs & GNU_LANG))

>From 160d719b7ed5997d39accb110df873e6200991d4 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 9 Mar 2025 14:14:37 -0400
Subject: [PATCH 5/5] exclude c99 symbols from builtins when std=c89

---
 clang/lib/Basic/Builtins.cpp              | 20 ++++++++++++++++++--
 clang/test/C/drs/c89_with_c99_functions.c | 14 ++++++++++----
 2 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp
index 81f85bb5454e4..70ea34da1f9e6 100644
--- a/clang/lib/Basic/Builtins.cpp
+++ b/clang/lib/Basic/Builtins.cpp
@@ -17,6 +17,7 @@
 #include "clang/Basic/LangStandard.h"
 #include "clang/Basic/TargetInfo.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/StringTable.h"
 using namespace clang;
 
 const char *HeaderDesc::getName() const {
@@ -136,6 +137,18 @@ bool Builtin::Context::isBuiltinFunc(llvm::StringRef FuncName) {
   return false;
 }
 
+static bool isSymbolAvailableInC89(const llvm::StringTable& Strings, const Builtin::Info & BuiltinInfo) {
+
+  auto NameStr = Strings[BuiltinInfo.Offsets.Name];
+
+  // FIXME: add other C89 symbols here
+  if(NameStr == "log") {
+    return true;
+  }
+
+  return false;
+}
+
 /// Is this builtin supported according to the given language options?
 static bool builtinIsSupported(const llvm::StringTable &Strings,
                                const Builtin::Info &BuiltinInfo,
@@ -148,9 +161,12 @@ static bool builtinIsSupported(const llvm::StringTable &Strings,
   /* CorBuiltins Unsupported */
   if (!LangOpts.Coroutines && (BuiltinInfo.Langs & COR_LANG))
     return false;
+  bool isC89 = /*C89*/ LangOpts.LangStd == LangStandard::lang_c89;
+  if (isC89 && !isSymbolAvailableInC89(Strings, BuiltinInfo)) {
+    return false;
+  }
   /* MathBuiltins Unsupported */
-  if ((LangOpts.NoMathBuiltin ||
-       /*C89*/ LangOpts.LangStd == LangStandard::lang_c89) &&
+  if (LangOpts.NoMathBuiltin &&
       BuiltinInfo.Header.ID == HeaderDesc::MATH_H)
     return false;
   /* GnuMode Unsupported */
diff --git a/clang/test/C/drs/c89_with_c99_functions.c b/clang/test/C/drs/c89_with_c99_functions.c
index de525313fbba5..aa3672eda1c53 100644
--- a/clang/test/C/drs/c89_with_c99_functions.c
+++ b/clang/test/C/drs/c89_with_c99_functions.c
@@ -1,8 +1,14 @@
-// RUN: %clang_cc1 -std=c89 -verify %s
-// expected-no-diagnostics
+// RUN: %clang_cc1 -std=c89 -verify=c89 %s
 
 // From: https://github.com/llvm/llvm-project/issues/15522#issue-1071059939
-int logf = 5;
+int logf = 5; // this is fine
+
+// redefinition because log as a symbol exists in C89
+int log = 6; // #1
 int main() {
-return logf;
+return 0;
 }
+
+// c89-error@#1 {{redefinition of 'log' as different kind of symbol}}
+// c89-note@#1 {{unguarded header; consider using #ifdef guards or #pragma once}}
+// c89-note@#1 {{previous definition}}



More information about the cfe-commits mailing list