[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-24 Thread Amr Hesham via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

AmrDeveloper wrote:

> None I can think of at the moment unfortunately. If i run across one, I'll 
> bring it up.

Thank you, I created a PR for the test cases, and I will continue searching for 
a good function or a place so I can create a one

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-24 Thread Erich Keane via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

erichkeane wrote:

None I can think of at the moment unfortunately.  If i run across one, I'll 
bring it up.



https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-24 Thread Amr Hesham via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

AmrDeveloper wrote:

Do we have a similar case with a place that covers most cases of using 
CallExpr, I found a function like `CheckInvalidBuiltinCountedByRef`, but it 
does not cover all cases @erichkeane 

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-22 Thread Amr Hesham via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

AmrDeveloper wrote:

Cool, I will understand the Sema structure more and move it :D

Thanks

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-22 Thread Erich Keane via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

erichkeane wrote:

We cannot really, since there is no such thing as 'phase 2' for most of the 
program (non templates).  Typically if you want something ONLY during phase 2, 
you do it during tree-transform or during the calls to the 'Rebuild' functions.

So you ALSO have to do it during phase-1, but the phase-2 work can suppress its 
diagnostic if it has already been done (assuming you are close enough to 
rebuild to do that).

The fix is likely that you'll have to mvoe where this is diagnosed to somewhere 
that isn't currently being called by the template instantiation, and re-add it 
then.

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-22 Thread Amr Hesham via cfe-commits

https://github.com/AmrDeveloper edited 
https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-22 Thread Amr Hesham via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

AmrDeveloper wrote:

Yes, exactly.

Can we just enabled it only on phase 2 🤔, Not sure if we have a way to know in 
which phase we are?



https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-22 Thread Erich Keane via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

erichkeane wrote:

Ah, in that case it is that the same checking code is being called during 
instantiation, which it almost definitely has to be (to catch the dependent 
case).

So what you're getting is:

```
std::numeric_limits::infinity(); << Diagnosed ONLY during "Phase 2" of 
template instantiation.
  std::numeric_limits::infinity(); << Diagnosed BOTH during Phase1 and 
Phase2.
```

Unfortunately we don't have a GREAT way to suppress warnings in these cases if 
you don't have access to the actual TreeTransform calls.  Typically we'd try to 
put the diagnostic somewhere this is ONLY called in Phase1, plus do it again 
ONLY if transformation happened during Phase 2.

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-22 Thread Amr Hesham via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

AmrDeveloper wrote:

Yes I expected two too but what I got is two same warns on 
`std::numeric_limits::infinity();` and one on 
`td::numeric_limits::infinity()`, I am trying to understand from where the 
extra one come from

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-22 Thread Erich Keane via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

erichkeane wrote:

Sorry, I'm not getting your point in the previous message.  Can you explain it 
more for me?  

>From my example, I would expect _TWO_ diagnostics (one per use). But I don't 
>want 3 or 4 diagnostics.

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-22 Thread Amr Hesham via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

AmrDeveloper wrote:

The same problem will happen with `isinf`, `isnan` and `isunordered` functions 
because the diagnostic will be reported for every generated function, we need 
to think of a way to process it once @erichkeane  

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-21 Thread Amr Hesham via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

AmrDeveloper wrote:

I found that we got `use of infinity is undefined behavior due to the currently 
enabled floating-point options` for `std::numeric_limits::infinity();` 
for each copy generated from `foo` function, I will check it more and handle it 
in different pr

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-21 Thread Erich Keane via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+

erichkeane wrote:

I would like a dependent test or two, to make sure we don't get this 
wrong/double-diagnose :

```
template
void foo() {
  std::numeric_limits::infinity();
  std::numeric_limits::infinity();
}

foo();
```

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Amr Hesham via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();

AmrDeveloper wrote:

> So what happens if we are using `using namespace std` and use 
> `numeric_limits<...>::infinity()` do we expect a diagnostic?

Yes should expect a diagnostic because we check Decl name space not the call 
expr,

I will create a pr to cover this case and update minor comment related to 
namespace

I will tag you as reviewer once I push it

Thanks

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Shafik Yaghmour via cfe-commits


@@ -48,24 +48,49 @@ namespace std __attribute__((__visibility__("default"))) {
   isnan(double __x);
   bool
   isnan(long double __x);
-bool
+  bool
   isfinite(float __x);
   bool
   isfinite(double __x);
   bool
   isfinte(long double __x);
- bool
+  bool
   isunordered(float __x, float __y);
   bool
   isunordered(double __x, double __y);
   bool
   isunordered(long double __x, long double __y);
+
+template 
+class numeric_limits {
+public:
+[[nodiscard]] static constexpr _Ty infinity() noexcept {
+return _Ty();
+}
+};
+
 } // namespace )
 }

shafik wrote:

we should annotate the std namespace as well `// std`

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Shafik Yaghmour via cfe-commits

https://github.com/shafik edited 
https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Shafik Yaghmour via cfe-commits

https://github.com/shafik edited 
https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Shafik Yaghmour via cfe-commits

https://github.com/shafik commented:

quick questions

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Shafik Yaghmour via cfe-commits


@@ -216,11 +244,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();

shafik wrote:

So what happens if we are using `using namespace std` and use 
`numeric_limits<...>::infinity()` do we expect a diagnostic?

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Amr Hesham via cfe-commits

https://github.com/AmrDeveloper closed 
https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Amr Hesham via cfe-commits


@@ -8454,26 +8454,43 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity")
+return false;
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits")
+  return false;
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext()))
+  return NSDecl->isStdNamespace();
+  }
+
+  return false;
+}
+
 void Sema::CheckInfNaNFunction(const CallExpr *Call,
const FunctionDecl *FDecl) {
+  if (!FDecl->getIdentifier())

AmrDeveloper wrote:

Thank you

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Zahira Ammarguellat via cfe-commits

https://github.com/zahiraam approved this pull request.

LGTM. Thanks.

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Zahira Ammarguellat via cfe-commits


@@ -8454,26 +8454,43 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity")
+return false;
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits")
+  return false;
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext()))
+  return NSDecl->isStdNamespace();
+  }
+
+  return false;
+}
+
 void Sema::CheckInfNaNFunction(const CallExpr *Call,
const FunctionDecl *FDecl) {
+  if (!FDecl->getIdentifier())

zahiraam wrote:

Oh! right, That makes sense!

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Amr Hesham via cfe-commits

https://github.com/AmrDeveloper edited 
https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Amr Hesham via cfe-commits

https://github.com/AmrDeveloper edited 
https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Amr Hesham via cfe-commits

https://github.com/AmrDeveloper edited 
https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Amr Hesham via cfe-commits

https://github.com/AmrDeveloper edited 
https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Amr Hesham via cfe-commits


@@ -8454,26 +8454,43 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity")
+return false;
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits")
+  return false;
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext()))
+  return NSDecl->isStdNamespace();
+  }
+
+  return false;
+}
+
 void Sema::CheckInfNaNFunction(const CallExpr *Call,
const FunctionDecl *FDecl) {
+  if (!FDecl->getIdentifier())

AmrDeveloper wrote:

The problem with this is in case of `FPO.getNoHonorNaNs() == false` we 
performed un needed 3 function call, and in case of it's true we performed 3 
more un needed too `IsInfOrIsFinite`, `IsInfinityOrIsSpecialInf`

```call
bool IsNaNOrIsUnordered =
IsStdFunction(FDecl, "isnan") || IsStdFunction(FDecl, "isunordered");
bool IsSpecialNaN =
IsInfOrNanFunction(FDecl->getName(), MathCheck::NaN);

if ((IsNaNOrIsUnordered || IsSpecialNaN) && false) { <--- Condition will 
evaluated to false

}
```

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Zahira Ammarguellat via cfe-commits


@@ -8454,26 +8454,43 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity")
+return false;
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits")
+  return false;
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext()))
+  return NSDecl->isStdNamespace();
+  }
+
+  return false;
+}
+
 void Sema::CheckInfNaNFunction(const CallExpr *Call,
const FunctionDecl *FDecl) {
+  if (!FDecl->getIdentifier())

zahiraam wrote:

Wouldn't something like this work?
```suggestion
  if (!FDecl->getIdentifier())
  return;
FPOptions FPO = Call->getFPFeaturesInEffect(getLangOpts());
bool IsNaNOrIsUnordered =
IsStdFunction(FDecl, "isnan") || IsStdFunction(FDecl, "isunordered");
bool IsSpecialNaN =
IsInfOrNanFunction(FDecl->getName(), MathCheck::NaN);
bool IsInfOrIsFinite =
IsStdFunction(FDecl, "isinf") || IsStdFunction(FDecl, "isfinite");
bool IsInfinityOrIsSpecialInf =
IsInfOrNanFunction(FDecl->getName(), MathCheck::Inf);

if ((IsNaNOrIsUnordered || IsSpecialNaN) && FPO.getNoHonorNaNs()) {
  Diag(Call->getBeginLoc(), diag::warn_fp_nan_inf_when_disabled)
  << 1 << 0 << Call->getSourceRange();
  return;
}
if ((IsInfOrIsFinite || IsInfinityFunction(FDecl) ||
 IsInfinityOrIsSpecialInf) &&
FPO.getNoHonorInfs()) {
  Diag(Call->getBeginLoc(), diag::warn_fp_nan_inf_when_disabled)
  << 0 << 0 << Call->getSourceRange();
}
```

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Amr Hesham via cfe-commits


@@ -8454,26 +8454,43 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity")
+return false;
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits")
+  return false;
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext()))
+  return NSDecl->isStdNamespace();
+  }
+
+  return false;
+}
+
 void Sema::CheckInfNaNFunction(const CallExpr *Call,
const FunctionDecl *FDecl) {
+  if (!FDecl->getIdentifier())
+return;
+
   FPOptions FPO = Call->getFPFeaturesInEffect(getLangOpts());
-  bool HasIdentifier = FDecl->getIdentifier() != nullptr;
-  bool IsNaNOrIsUnordered =
-  IsStdFunction(FDecl, "isnan") || IsStdFunction(FDecl, "isunordered");
-  bool IsSpecialNaN =
-  HasIdentifier && IsInfOrNanFunction(FDecl->getName(), MathCheck::NaN);
-  if ((IsNaNOrIsUnordered || IsSpecialNaN) && FPO.getNoHonorNaNs()) {
+  if (FPO.getNoHonorNaNs() &&
+  (IsStdFunction(FDecl, "isnan") || IsStdFunction(FDecl, "isunordered") ||
+   IsInfOrNanFunction(FDecl->getName(), MathCheck::NaN))) {

AmrDeveloper wrote:

I don't mind but my point was that functions are readable for example, for the 
first boolean, we can easily know the meaning from the condition itself.

```cpp
bool IsInfOrIsFinite =
IsStdFunction(FDecl, "isinf") || IsStdFunction(FDecl, "isfinite");
bool IsInfinityOrIsSpecialInf =
HasIdentifier && ((FDecl->getName() == "infinity") ||
  IsInfOrNanFunction(FDecl->getName(), MathCheck::Inf));
```


Also I am thinking of performing the checking only if `FPO.getNoHonorInfs()` is 
true, so to do this with variables either I need to introduce another variable 
for each case to perform other conditions then if it true, or merge it with 
`IsInfOrIsFinite` so it will be like `IsNoHonorInfsAndIsInfOrIsFinite` and 
`IsNoHonorInfsAndIsInfinityOrIsSpecialInf` then in the if condition makes sure 
one of them is true and I think that's less readable that the current code.


What do you think? @zahiraam 

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-20 Thread Zahira Ammarguellat via cfe-commits


@@ -8454,26 +8454,43 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity")
+return false;
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits")
+  return false;
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext()))
+  return NSDecl->isStdNamespace();
+  }
+
+  return false;
+}
+
 void Sema::CheckInfNaNFunction(const CallExpr *Call,
const FunctionDecl *FDecl) {
+  if (!FDecl->getIdentifier())
+return;
+
   FPOptions FPO = Call->getFPFeaturesInEffect(getLangOpts());
-  bool HasIdentifier = FDecl->getIdentifier() != nullptr;
-  bool IsNaNOrIsUnordered =
-  IsStdFunction(FDecl, "isnan") || IsStdFunction(FDecl, "isunordered");
-  bool IsSpecialNaN =
-  HasIdentifier && IsInfOrNanFunction(FDecl->getName(), MathCheck::NaN);
-  if ((IsNaNOrIsUnordered || IsSpecialNaN) && FPO.getNoHonorNaNs()) {
+  if (FPO.getNoHonorNaNs() &&
+  (IsStdFunction(FDecl, "isnan") || IsStdFunction(FDecl, "isunordered") ||
+   IsInfOrNanFunction(FDecl->getName(), MathCheck::NaN))) {

zahiraam wrote:

I think for readability the intermediate `bool` variables can be kept. Same for 
the condition below.

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread Amr Hesham via cfe-commits

AmrDeveloper wrote:

> LGTM with nits

Thank you, I addressed the nits

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread Amr Hesham via cfe-commits

https://github.com/AmrDeveloper updated 
https://github.com/llvm/llvm-project/pull/123417

>From 51dd53feb7a35d4fac648dd165fb5b99f73c6c24 Mon Sep 17 00:00:00 2001
From: AmrDeveloper 
Date: Fri, 17 Jan 2025 23:32:48 +0100
Subject: [PATCH 1/4] [Clang] Fix invalid use of infinity warning

---
 clang/lib/Sema/SemaChecking.cpp   | 22 +-
 .../Sema/warn-infinity-nan-disabled-lnx.cpp   | 42 --
 .../Sema/warn-infinity-nan-disabled-win.cpp   | 43 +--
 3 files changed, 98 insertions(+), 9 deletions(-)

diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 881907ac311a30..3d2b2e1e96d2dd 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -8454,6 +8454,26 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity") {
+return false;
+  }
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits") {
+  return false;
+}
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext())) {
+  return NSDecl->isStdNamespace();
+}
+  }
+
+  return false;
+}
+
 void Sema::CheckInfNaNFunction(const CallExpr *Call,
const FunctionDecl *FDecl) {
   FPOptions FPO = Call->getFPFeaturesInEffect(getLangOpts());
@@ -8469,7 +8489,7 @@ void Sema::CheckInfNaNFunction(const CallExpr *Call,
 bool IsInfOrIsFinite =
 IsStdFunction(FDecl, "isinf") || IsStdFunction(FDecl, "isfinite");
 bool IsInfinityOrIsSpecialInf =
-HasIdentifier && ((FDecl->getName() == "infinity") ||
+HasIdentifier && (IsInfinityFunction(FDecl) ||
   IsInfOrNanFunction(FDecl->getName(), 
MathCheck::Inf));
 if ((IsInfOrIsFinite || IsInfinityOrIsSpecialInf) && FPO.getNoHonorInfs())
   Diag(Call->getBeginLoc(), diag::warn_fp_nan_inf_when_disabled)
diff --git a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp 
b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp
index 357c9e5b641073..4f46b777c88742 100644
--- a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp
+++ b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp
@@ -45,24 +45,48 @@ namespace std __attribute__((__visibility__("default"))) {
   isnan(double __x);
   bool
   isnan(long double __x);
-bool
+  bool
   isfinite(float __x);
   bool
   isfinite(double __x);
   bool
   isfinte(long double __x);
- bool
+  bool
   isunordered(float __x, float __y);
   bool
   isunordered(double __x, double __y);
   bool
   isunordered(long double __x, long double __y);
+
+template 
+class numeric_limits {
+public:
+[[nodiscard]] static constexpr _Ty infinity() noexcept {
+return _Ty();
+}
+};
 } // namespace )
 }
 
 #define NAN (__builtin_nanf(""))
 #define INFINITY (__builtin_inff())
 
+template <>
+class std::numeric_limits  {
+public:
+[[nodiscard]] static constexpr float infinity() noexcept {
+return __builtin_huge_val();
+}
+};
+
+template <>
+class std::numeric_limits  {
+public:
+[[nodiscard]] static constexpr double infinity() noexcept {
+return __builtin_huge_val();
+}
+};
+
 template 
 class numeric_limits {
 public:
@@ -78,6 +102,7 @@ class numeric_limits  {
 return __builtin_huge_val();
 }
 };
+
 template <>
 class numeric_limits  {
 public:
@@ -86,6 +111,8 @@ class numeric_limits  {
 }
 };
 
+double infinity() { return 0; }
+
 int compareit(float a, float b) {
   volatile int i, j, k, l, m, n, o, p;
 // no-inf-no-nan-warning@+4 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
@@ -225,11 +252,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+
   return 0;
 
 }
diff --git a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp 
b/clang/test/Sema/warn-infinity-nan-disabled-win.cpp
index ee4eb33a16e449..655024f5909b33 100644
--- a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp
+++ b/clang/test/Sem

[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread via cfe-commits

https://github.com/cor3ntin edited 
https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread via cfe-commits


@@ -8454,26 +8454,47 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity") {
+return false;
+  }
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits") {
+  return false;
+}
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext())) {
+  return NSDecl->isStdNamespace();
+}
+  }
+
+  return false;
+}
+
 void Sema::CheckInfNaNFunction(const CallExpr *Call,
const FunctionDecl *FDecl) {
+  if (!FDecl->getIdentifier()) {
+return;
+  }
+

cor3ntin wrote:

```suggestion
  if (!FDecl->getIdentifier())
return;
 
```

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread via cfe-commits


@@ -8454,26 +8454,47 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity") {
+return false;
+  }
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits") {
+  return false;
+}
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext())) {
+  return NSDecl->isStdNamespace();
+}
+  }
+
+  return false;
+}
+

cor3ntin wrote:

```suggestion
  if (FDecl->getName() != "infinity")
return false;

  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
const CXXRecordDecl *RDecl = MDecl->getParent();
if (RDecl->getName() != "numeric_limits")
  return false;

if (const NamespaceDecl *NSDecl =
dyn_cast(RDecl->getDeclContext()))
  return NSDecl->isStdNamespace();
  }

  return false;
}

```

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread via cfe-commits

https://github.com/cor3ntin approved this pull request.

LGTM with nits

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread Amr Hesham via cfe-commits

AmrDeveloper wrote:

> Can you add a changelog entry? Thanks

Done, thanks

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread Amr Hesham via cfe-commits

https://github.com/AmrDeveloper updated 
https://github.com/llvm/llvm-project/pull/123417

>From 51dd53feb7a35d4fac648dd165fb5b99f73c6c24 Mon Sep 17 00:00:00 2001
From: AmrDeveloper 
Date: Fri, 17 Jan 2025 23:32:48 +0100
Subject: [PATCH 1/3] [Clang] Fix invalid use of infinity warning

---
 clang/lib/Sema/SemaChecking.cpp   | 22 +-
 .../Sema/warn-infinity-nan-disabled-lnx.cpp   | 42 --
 .../Sema/warn-infinity-nan-disabled-win.cpp   | 43 +--
 3 files changed, 98 insertions(+), 9 deletions(-)

diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 881907ac311a30..3d2b2e1e96d2dd 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -8454,6 +8454,26 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity") {
+return false;
+  }
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits") {
+  return false;
+}
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext())) {
+  return NSDecl->isStdNamespace();
+}
+  }
+
+  return false;
+}
+
 void Sema::CheckInfNaNFunction(const CallExpr *Call,
const FunctionDecl *FDecl) {
   FPOptions FPO = Call->getFPFeaturesInEffect(getLangOpts());
@@ -8469,7 +8489,7 @@ void Sema::CheckInfNaNFunction(const CallExpr *Call,
 bool IsInfOrIsFinite =
 IsStdFunction(FDecl, "isinf") || IsStdFunction(FDecl, "isfinite");
 bool IsInfinityOrIsSpecialInf =
-HasIdentifier && ((FDecl->getName() == "infinity") ||
+HasIdentifier && (IsInfinityFunction(FDecl) ||
   IsInfOrNanFunction(FDecl->getName(), 
MathCheck::Inf));
 if ((IsInfOrIsFinite || IsInfinityOrIsSpecialInf) && FPO.getNoHonorInfs())
   Diag(Call->getBeginLoc(), diag::warn_fp_nan_inf_when_disabled)
diff --git a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp 
b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp
index 357c9e5b641073..4f46b777c88742 100644
--- a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp
+++ b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp
@@ -45,24 +45,48 @@ namespace std __attribute__((__visibility__("default"))) {
   isnan(double __x);
   bool
   isnan(long double __x);
-bool
+  bool
   isfinite(float __x);
   bool
   isfinite(double __x);
   bool
   isfinte(long double __x);
- bool
+  bool
   isunordered(float __x, float __y);
   bool
   isunordered(double __x, double __y);
   bool
   isunordered(long double __x, long double __y);
+
+template 
+class numeric_limits {
+public:
+[[nodiscard]] static constexpr _Ty infinity() noexcept {
+return _Ty();
+}
+};
 } // namespace )
 }
 
 #define NAN (__builtin_nanf(""))
 #define INFINITY (__builtin_inff())
 
+template <>
+class std::numeric_limits  {
+public:
+[[nodiscard]] static constexpr float infinity() noexcept {
+return __builtin_huge_val();
+}
+};
+
+template <>
+class std::numeric_limits  {
+public:
+[[nodiscard]] static constexpr double infinity() noexcept {
+return __builtin_huge_val();
+}
+};
+
 template 
 class numeric_limits {
 public:
@@ -78,6 +102,7 @@ class numeric_limits  {
 return __builtin_huge_val();
 }
 };
+
 template <>
 class numeric_limits  {
 public:
@@ -86,6 +111,8 @@ class numeric_limits  {
 }
 };
 
+double infinity() { return 0; }
+
 int compareit(float a, float b) {
   volatile int i, j, k, l, m, n, o, p;
 // no-inf-no-nan-warning@+4 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
@@ -225,11 +252,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+
   return 0;
 
 }
diff --git a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp 
b/clang/test/Sema/warn-infinity-nan-disabled-win.cpp
index ee4eb33a16e449..655024f5909b33 100644
--- a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp
+++ b/clang/test/Sem

[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread via cfe-commits

https://github.com/cor3ntin commented:

Can you add a changelog entry? Thanks

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread Amr Hesham via cfe-commits


@@ -8469,7 +8489,7 @@ void Sema::CheckInfNaNFunction(const CallExpr *Call,
 bool IsInfOrIsFinite =

AmrDeveloper wrote:

I think it's better now, early return if there is no identifier and check 
`NoHonor.. `first before checking for function name

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread Amr Hesham via cfe-commits

https://github.com/AmrDeveloper updated 
https://github.com/llvm/llvm-project/pull/123417

>From 51dd53feb7a35d4fac648dd165fb5b99f73c6c24 Mon Sep 17 00:00:00 2001
From: AmrDeveloper 
Date: Fri, 17 Jan 2025 23:32:48 +0100
Subject: [PATCH 1/2] [Clang] Fix invalid use of infinity warning

---
 clang/lib/Sema/SemaChecking.cpp   | 22 +-
 .../Sema/warn-infinity-nan-disabled-lnx.cpp   | 42 --
 .../Sema/warn-infinity-nan-disabled-win.cpp   | 43 +--
 3 files changed, 98 insertions(+), 9 deletions(-)

diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 881907ac311a30..3d2b2e1e96d2dd 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -8454,6 +8454,26 @@ static bool IsInfOrNanFunction(StringRef calleeName, 
MathCheck Check) {
   llvm_unreachable("unknown MathCheck");
 }
 
+static bool IsInfinityFunction(const FunctionDecl *FDecl) {
+  if (FDecl->getName() != "infinity") {
+return false;
+  }
+
+  if (const CXXMethodDecl *MDecl = dyn_cast(FDecl)) {
+const CXXRecordDecl *RDecl = MDecl->getParent();
+if (RDecl->getName() != "numeric_limits") {
+  return false;
+}
+
+if (const NamespaceDecl *NSDecl =
+dyn_cast(RDecl->getDeclContext())) {
+  return NSDecl->isStdNamespace();
+}
+  }
+
+  return false;
+}
+
 void Sema::CheckInfNaNFunction(const CallExpr *Call,
const FunctionDecl *FDecl) {
   FPOptions FPO = Call->getFPFeaturesInEffect(getLangOpts());
@@ -8469,7 +8489,7 @@ void Sema::CheckInfNaNFunction(const CallExpr *Call,
 bool IsInfOrIsFinite =
 IsStdFunction(FDecl, "isinf") || IsStdFunction(FDecl, "isfinite");
 bool IsInfinityOrIsSpecialInf =
-HasIdentifier && ((FDecl->getName() == "infinity") ||
+HasIdentifier && (IsInfinityFunction(FDecl) ||
   IsInfOrNanFunction(FDecl->getName(), 
MathCheck::Inf));
 if ((IsInfOrIsFinite || IsInfinityOrIsSpecialInf) && FPO.getNoHonorInfs())
   Diag(Call->getBeginLoc(), diag::warn_fp_nan_inf_when_disabled)
diff --git a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp 
b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp
index 357c9e5b641073..4f46b777c88742 100644
--- a/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp
+++ b/clang/test/Sema/warn-infinity-nan-disabled-lnx.cpp
@@ -45,24 +45,48 @@ namespace std __attribute__((__visibility__("default"))) {
   isnan(double __x);
   bool
   isnan(long double __x);
-bool
+  bool
   isfinite(float __x);
   bool
   isfinite(double __x);
   bool
   isfinte(long double __x);
- bool
+  bool
   isunordered(float __x, float __y);
   bool
   isunordered(double __x, double __y);
   bool
   isunordered(long double __x, long double __y);
+
+template 
+class numeric_limits {
+public:
+[[nodiscard]] static constexpr _Ty infinity() noexcept {
+return _Ty();
+}
+};
 } // namespace )
 }
 
 #define NAN (__builtin_nanf(""))
 #define INFINITY (__builtin_inff())
 
+template <>
+class std::numeric_limits  {
+public:
+[[nodiscard]] static constexpr float infinity() noexcept {
+return __builtin_huge_val();
+}
+};
+
+template <>
+class std::numeric_limits  {
+public:
+[[nodiscard]] static constexpr double infinity() noexcept {
+return __builtin_huge_val();
+}
+};
+
 template 
 class numeric_limits {
 public:
@@ -78,6 +102,7 @@ class numeric_limits  {
 return __builtin_huge_val();
 }
 };
+
 template <>
 class numeric_limits  {
 public:
@@ -86,6 +111,8 @@ class numeric_limits  {
 }
 };
 
+double infinity() { return 0; }
+
 int compareit(float a, float b) {
   volatile int i, j, k, l, m, n, o, p;
 // no-inf-no-nan-warning@+4 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
@@ -225,11 +252,18 @@ int compareit(float a, float b) {
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  double y = i * numeric_limits::infinity();
+  double y = i * std::numeric_limits::infinity();
+
+  y = i * numeric_limits::infinity(); // expected-no-diagnostics
 
 // no-inf-no-nan-warning@+2 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
 // no-inf-warning@+1 {{use of infinity is undefined behavior due to the 
currently enabled floating-point options}}
-  j = numeric_limits::infinity();
+  j = std::numeric_limits::infinity();
+
+  j = numeric_limits::infinity(); // expected-no-diagnostics
+
+  y = infinity(); // expected-no-diagnostics
+
   return 0;
 
 }
diff --git a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp 
b/clang/test/Sema/warn-infinity-nan-disabled-win.cpp
index ee4eb33a16e449..655024f5909b33 100644
--- a/clang/test/Sema/warn-infinity-nan-disabled-win.cpp
+++ b/clang/test/Sem

[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread Amr Hesham via cfe-commits


@@ -8469,7 +8489,7 @@ void Sema::CheckInfNaNFunction(const CallExpr *Call,
 bool IsInfOrIsFinite =

AmrDeveloper wrote:

Yes, I agree, i am thinking to change the structure of the function 
`CheckInfNaNFunction ` too, because if `HasIdentifier` is false that's means 
`IsStdFunction`, `IsInfOrNanFunction` and `IsInfinityFunction` will return 
false, so maybe we can just eliminate some un needed function calls by early 
return.

I will try and update you with result :D

https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-18 Thread via cfe-commits


@@ -8469,7 +8489,7 @@ void Sema::CheckInfNaNFunction(const CallExpr *Call,
 bool IsInfOrIsFinite =

cor3ntin wrote:

As an aside, this is called on every function call, which seems widely 
inficient.

can we do something like
```cpp
FPOptions FPO = Call->getFPFeaturesInEffect(getLangOpts());
if(FPO.getNoHonorInfs())
  return;
```

(and remove `FPO.getNoHonorInfs()` in the rest of the function)







https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang] Fix warning for non std functions with name `infinity` (PR #123417)

2025-01-17 Thread Amr Hesham via cfe-commits

https://github.com/AmrDeveloper edited 
https://github.com/llvm/llvm-project/pull/123417
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits