[clang] C89 doesn't have `math.h` functions (PR #129979)
Vinay Deshmukh via cfe-commits
cfe-commits at lists.llvm.org
Sun Mar 9 18:37:36 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/8] 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/8] 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/8] 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/8] 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/8] 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}}
>From 7572c217f84214af8aa06a219ead9382af6b148b Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 9 Mar 2025 14:19:20 -0400
Subject: [PATCH 6/8] clang-format
---
clang/lib/Basic/Builtins.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp
index 70ea34da1f9e6..4795a7fca6a08 100644
--- a/clang/lib/Basic/Builtins.cpp
+++ b/clang/lib/Basic/Builtins.cpp
@@ -137,12 +137,13 @@ bool Builtin::Context::isBuiltinFunc(llvm::StringRef FuncName) {
return false;
}
-static bool isSymbolAvailableInC89(const llvm::StringTable& Strings, const Builtin::Info & BuiltinInfo) {
+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") {
+ if (NameStr == "log") {
return true;
}
@@ -166,8 +167,7 @@ static bool builtinIsSupported(const llvm::StringTable &Strings,
return false;
}
/* MathBuiltins Unsupported */
- if (LangOpts.NoMathBuiltin &&
- BuiltinInfo.Header.ID == HeaderDesc::MATH_H)
+ if (LangOpts.NoMathBuiltin && BuiltinInfo.Header.ID == HeaderDesc::MATH_H)
return false;
/* GnuMode Unsupported */
if (!LangOpts.GNUMode && (BuiltinInfo.Langs & GNU_LANG))
>From 0afb18c710d8f6d5fb14ed62d0a003fdd9a44631 Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 9 Mar 2025 21:26:19 -0400
Subject: [PATCH 7/8] Allow __builtin_ prefixes
---
clang/lib/Basic/Builtins.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp
index 4795a7fca6a08..5bc5270e248fb 100644
--- a/clang/lib/Basic/Builtins.cpp
+++ b/clang/lib/Basic/Builtins.cpp
@@ -142,6 +142,10 @@ static bool isSymbolAvailableInC89(const llvm::StringTable &Strings,
auto NameStr = Strings[BuiltinInfo.Offsets.Name];
+ if(NameStr.starts_with("__builtin_")) {
+ return true;
+ }
+
// FIXME: add other C89 symbols here
if (NameStr == "log") {
return true;
>From d79f12776bc942d3a10d0811f68f2c29fe431c6a Mon Sep 17 00:00:00 2001
From: Vinay Deshmukh <32487576+vinay-deshmukh at users.noreply.github.com>
Date: Sun, 9 Mar 2025 21:37:10 -0400
Subject: [PATCH 8/8] __clang_
---
clang/lib/Basic/Builtins.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Basic/Builtins.cpp b/clang/lib/Basic/Builtins.cpp
index 5bc5270e248fb..d225f5d1af797 100644
--- a/clang/lib/Basic/Builtins.cpp
+++ b/clang/lib/Basic/Builtins.cpp
@@ -142,7 +142,7 @@ static bool isSymbolAvailableInC89(const llvm::StringTable &Strings,
auto NameStr = Strings[BuiltinInfo.Offsets.Name];
- if(NameStr.starts_with("__builtin_")) {
+ if(NameStr.starts_with("__builtin_") || NameStr.starts_with("__clang")) {
return true;
}
More information about the cfe-commits
mailing list