[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH 1/9] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index f
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH 1/9] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index f
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH 1/9] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index f
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH 1/9] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index f
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh edited https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
@@ -1200,3 +1200,20 @@ void ExprEngine::VisitLambdaExpr(const LambdaExpr *LE, ExplodedNode *Pred, // FIXME: Move all post/pre visits to ::Visit(). getCheckerManager().runCheckersForPostStmt(Dst, Tmp, LE, *this); } + +void ExprEngine::VisitAttributedStmt(const AttributedStmt *A, + ExplodedNode *Pred, ExplodedNodeSet &Dst) { + ExplodedNodeSet CheckerPreStmt; + getCheckerManager().runCheckersForPreStmt(CheckerPreStmt, Pred, A, *this); + + ExplodedNodeSet EvalSet; + StmtNodeBuilder Bldr(CheckerPreStmt, EvalSet, *currBldrCtx); + + if (const auto *AssumeAttr = getSpecificAttr(A->getAttrs())) { vinay-deshmukh wrote: @steakhal Q: As this is a `if()` instead of `for(const auto *AssumeAttr: A->getAttrs())`, won't it ignore the `assume()` expressions _after_ the first one? Should we restore the for loop so the ExprEngine processes all `assume()` attributes? i.e. this change: https://github.com/llvm/llvm-project/commit/7f1e341e59a52017d9f73ab09e1be45444536731 Before: https://github.com/llvm/llvm-project/blob/daddb9e13db6ca8373dc7298d17aa36a03014aeb/clang/lib/Analysis/CFG.cpp#L469-L479 After: https://github.com/llvm/llvm-project/blob/7f1e341e59a52017d9f73ab09e1be45444536731/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp#L1212-L1216 https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
@@ -1200,3 +1200,20 @@ void ExprEngine::VisitLambdaExpr(const LambdaExpr *LE, ExplodedNode *Pred, // FIXME: Move all post/pre visits to ::Visit(). getCheckerManager().runCheckersForPostStmt(Dst, Tmp, LE, *this); } + +void ExprEngine::VisitAttributedStmt(const AttributedStmt *A, + ExplodedNode *Pred, ExplodedNodeSet &Dst) { + ExplodedNodeSet CheckerPreStmt; + getCheckerManager().runCheckersForPreStmt(CheckerPreStmt, Pred, A, *this); + + ExplodedNodeSet EvalSet; + StmtNodeBuilder Bldr(CheckerPreStmt, EvalSet, *currBldrCtx); + + if (const auto *AssumeAttr = getSpecificAttr(A->getAttrs())) { vinay-deshmukh wrote: Same for the `for` -> `if` change in `CFG.cpp` https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh created https://github.com/llvm/llvm-project/pull/116462 Resolves #100762 >From 773601ec7d87ac80b1440b0297f3f8f622c83a9b Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 57 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 ++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 + clang/test/Analysis/out-of-bounds-new.cpp | 16 ++ 5 files changed, 111 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..23a0170b527a86 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,43 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] + +for (auto *child : attrStmt->children()) { + llvm::errs() << "\nchildren="; + child->dump(); +} + +for (const Attr *attr : attrStmt->getAttrs()) { + { +llvm::errs() << "\nattr="; +attr->printPretty(llvm::errs(), PrintingPolicy{LangOptions{}}); + } + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -465,6 +502,12 @@ reverse_children::reverse_children(Stmt *S) { // This needs to be done *after* childrenBuf has been populated. children = childrenBuf; + + // for(auto* child : children) + // { + // llvm::errs() << "\nchildren="; + // child->dump(); + // } } namespace { @@ -2475,6 +2518,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2541,12 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +// VINAY +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From d4ba202dc8a37f7b3d8eb91f5410410b8e191b31 Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 54 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 ++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 ++ clang/test/Analysis/out-of-bounds-new.cpp | 16 ++ 5 files changed, 108 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..4f44d020a9b727 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,45 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (auto *child : attrStmt->children()) { + llvm::errs() << "\nchildren="; + child->dump(); +} + +for (const Attr *attr : attrStmt->getAttrs()) { + { +llvm::errs() << "\nattr="; +attr->printPretty(llvm::errs(), PrintingPolicy{LangOptions{}}); + } + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -465,6 +504,7 @@ reverse_children::reverse_children(Stmt *S) { // This needs to be done *after* childrenBuf has been populated. children = childrenBuf; + } namespace { @@ -2475,6 +2515,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2538,12 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +// VINAY +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEng
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
vinay-deshmukh wrote: @steakhal Can you take a look at this PR when you have a chance? Thanks! https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh ready_for_review https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh edited https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From 336eb74f2c60ec74004f6c3625ba8bcf464e40b5 Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 52 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 ++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 ++ clang/test/Analysis/out-of-bounds-new.cpp | 16 ++ 5 files changed, 106 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..edf5eefa374807 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,45 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (auto *child : attrStmt->children()) { + llvm::errs() << "\nchildren="; + child->dump(); +} + +for (const Attr *attr : attrStmt->getAttrs()) { + { +llvm::errs() << "\nattr="; +attr->printPretty(llvm::errs(), PrintingPolicy{LangOptions{}}); + } + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2514,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2537,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index f7020
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH 1/9] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index f
[clang] Reapply "[analyzer] Handle [[assume(cond)]] as __builtin_assume(cond)" (PR #125348)
vinay-deshmukh wrote: @steakhal You can use: `vinay_deshmukh` AT `outlook` DOT `com` Thank you for looking into the issue again! https://github.com/llvm/llvm-project/pull/125348 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh edited https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh edited https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
vinay-deshmukh wrote: > I was thinking about the case, and I think it's okay to have state-splits in > the subexpressions coming from an assume expression - given that the assume > expression has no side effects. This way we should have 2 paths after the > assume expression (but still before the first if statement). > > 1. where `a > 10` is true > 2. where `a > 10` is false, aka. `a <= 10`. > > This is I think the current behavior of your proposed implementation. Could > you demonstrate it in tests? > > Something like this should prove it: > > ```c++ > int ternary_in_assume(int a, int b) { > [[assume(a > 10 ? b == 4 : b == 10)]]; > clang_analyzer_value(a); // we should have 2 dumps here. > clang_analyzer_dump(b); // This should be either 4 or 10. > if (a > 20) { > clang_analyzer_dump(b + 100); // expecting 104 > return; > } > if (a > 10) { > clang_analyzer_dump(b + 200); // expecting 204 > return; > } > clang_analyzer_dump(b + 300); // expecting 310 > } > ``` Summary for the latest commit: In the current implementation, when we run `clang_analyzer_dump`, it prints the actual constrained values (i.e. `b == 4` or `b == 10`), but it will **also** print `reg_$2`. As far as I can tell, this is exactly how it works for the `__builtin_assume` as well, except the difference is that when `core.BuiltinChecker` is run, it will eliminate the `ExplodedNode`(s) where the expression is false / "unconstrained". To pass the tests for now, I've added a `FIXME` that also "expects" the symbolic print as follows so `lit` tests "pass" : ```c++ clang_analyzer_dump(b + 100); // expected-warning{{104}} FIXME: expected-warning{{(reg_$2) + 100}} ``` As far as I know, to eliminate the warning emitted corresponding to the FIXME comment, we need to implement a new Checker for attributes; we can do this in a second PR to avoid scope creep for this issue/PR. P.S. I needed to add a check to `ExprEngine::VisitGuardedExpr` to "continue" if the ProgramPoint is a `StmtPoint`, because without it, the `getAs` runs into undefined behavior. Added an `assert` for that as well to be careful in the future. https://github.com/llvm/llvm-project/blob/eabbef2be6a4f956171a21632d8cf07b4a48e162/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp#L799-L810 now working on getting the tests to pass locally, might need some more minor fixes. https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH 01/10] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH 01/11] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH 01/11] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
vinay-deshmukh wrote: Aside: As I've been working on this issue, I've realized that it involves some complexities that might not make it an ideal "good first issue" (in my opinion). To keep labels consistent with the difficult level, if it is okay with you, it would be great if you could re-classify the original issue by removing the "good-first-issue" label as it might set incorrect expectations from new contributors. https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH 01/11] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh updated https://github.com/llvm/llvm-project/pull/116462 >From daddb9e13db6ca8373dc7298d17aa36a03014aeb Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 15 Nov 2024 07:37:17 -0500 Subject: [PATCH 01/11] [analyzer] Handle `[[assume(cond)]]` as `__builtin_assume(cond)` Resolves #100762 --- .../Core/PathSensitive/ExprEngine.h | 4 ++ clang/lib/Analysis/CFG.cpp| 43 +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 8 +++- .../lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 27 clang/test/Analysis/out-of-bounds-new.cpp | 16 +++ 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h index 8c7493e27fcaa6..078a1d840d0516 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h @@ -498,6 +498,10 @@ class ExprEngine { void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst); + /// VisitAttributedStmt - Transfer function logic for AttributedStmt + void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, + ExplodedNodeSet &Dst); + /// VisitLogicalExpr - Transfer function logic for '&&', '||' void VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred, ExplodedNodeSet &Dst); diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index f678ac6f2ff36a..fab10f51cf5cfc 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -456,6 +456,36 @@ reverse_children::reverse_children(Stmt *S) { IE->getNumInits()); return; } +case Stmt::AttributedStmtClass: { + AttributedStmt *attrStmt = cast(S); + assert(attrStmt); + + { +// for an attributed stmt, the "children()" returns only the NullStmt +// (;) but semantically the "children" are supposed to be the +// expressions _within_ i.e. the two square brackets i.e. [[ HERE ]] +// so we add the subexpressions first, _then_ add the "children" + +for (const Attr *attr : attrStmt->getAttrs()) { + + // i.e. one `assume()` + CXXAssumeAttr const *assumeAttr = llvm::dyn_cast(attr); + if (!assumeAttr) { +continue; + } + // Only handles [[ assume() ]] right now + Expr *assumption = assumeAttr->getAssumption(); + childrenBuf.push_back(assumption); +} + +// children() for an AttributedStmt is NullStmt(;) +llvm::append_range(childrenBuf, attrStmt->children()); + +// This needs to be done *after* childrenBuf has been populated. +children = childrenBuf; + } + return; +} default: break; } @@ -2475,6 +2505,14 @@ static bool isFallthroughStatement(const AttributedStmt *A) { return isFallthrough; } +static bool isCXXAssumeAttr(const AttributedStmt *A) { + bool hasAssumeAttr = hasSpecificAttr(A->getAttrs()); + + assert((!hasAssumeAttr || isa(A->getSubStmt())) && + "expected [[assume]] not to have children"); + return hasAssumeAttr; +} + CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, AddStmtChoice asc) { // AttributedStmts for [[likely]] can have arbitrary statements as children, @@ -2490,6 +2528,11 @@ CFGBlock *CFGBuilder::VisitAttributedStmt(AttributedStmt *A, appendStmt(Block, A); } + if (isCXXAssumeAttr(A) && asc.alwaysAdd(*this, A)) { +autoCreateBlock(); +appendStmt(Block, A); + } + return VisitChildren(A); } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 22eab9f66418d4..cbc83f1dbda145 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1946,7 +1946,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // to be explicitly evaluated. case Stmt::PredefinedExprClass: case Stmt::AddrLabelExprClass: -case Stmt::AttributedStmtClass: case Stmt::IntegerLiteralClass: case Stmt::FixedPointLiteralClass: case Stmt::CharacterLiteralClass: @@ -1977,6 +1976,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, break; } +case Stmt::AttributedStmtClass: { + Bldr.takeNodes(Pred); + VisitAttributedStmt(cast(S), Pred, Dst); + Bldr.addNodes(Dst); + break; +} + case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: { Bldr.takeNodes(Pred); diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
https://github.com/vinay-deshmukh edited https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
vinay-deshmukh wrote: Looks good to me @steakhal ! Thanks for the review! https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [lld] [llvm] Remove `urllib2` and `SocketServer` (PR #120723)
@@ -39,7 +36,6 @@ def url_is_up(url): def start_browser(port, options): -import webbrowser vinay-deshmukh wrote: Due to this import, the import on L17 is unused. let me know if keeping this one and removing the import from L17 is more preferable. https://github.com/llvm/llvm-project/pull/120723 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [lld] [llvm] Remove `urllib2` and `SocketServer` (PR #120723)
https://github.com/vinay-deshmukh created https://github.com/llvm/llvm-project/pull/120723 Resolves #120299 1. Testing in CI >From 5f7a46d117053b582b8ee4c91a46e5edd84fbad2 Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:56:26 +0530 Subject: [PATCH 1/3] Remove `urllib2` --- clang/docs/tools/dump_ast_matchers.py | 5 + clang/tools/scan-view/bin/scan-view | 5 + lld/utils/benchmark.py| 8 ++-- llvm/utils/unicode-case-fold.py | 5 + 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/clang/docs/tools/dump_ast_matchers.py b/clang/docs/tools/dump_ast_matchers.py index b6f00657ec914c..4c4a2bd1e9d5a7 100755 --- a/clang/docs/tools/dump_ast_matchers.py +++ b/clang/docs/tools/dump_ast_matchers.py @@ -7,10 +7,7 @@ import re import os -try: -from urllib.request import urlopen -except ImportError: -from urllib2 import urlopen +from urllib.request import urlopen CLASS_INDEX_PAGE_URL = "https://clang.llvm.org/doxygen/classes.html"; try: diff --git a/clang/tools/scan-view/bin/scan-view b/clang/tools/scan-view/bin/scan-view index d01aebb4029a75..f8dc6c18018de1 100755 --- a/clang/tools/scan-view/bin/scan-view +++ b/clang/tools/scan-view/bin/scan-view @@ -10,10 +10,7 @@ import os import posixpath import threading import time -try: -from urllib.request import urlopen -except ImportError: -from urllib2 import urlopen +from urllib.request import urlopen import webbrowser # How long to wait for server to start. diff --git a/lld/utils/benchmark.py b/lld/utils/benchmark.py index 7202e07ec438d2..4257f6bb160565 100755 --- a/lld/utils/benchmark.py +++ b/lld/utils/benchmark.py @@ -14,12 +14,8 @@ import datetime import argparse -try: -from urllib.parse import urlencode -from urllib.request import urlopen, Request -except ImportError: -from urllib import urlencode -from urllib2 import urlopen, Request +from urllib.parse import urlencode +from urllib.request import urlopen, Request parser = argparse.ArgumentParser() diff --git a/llvm/utils/unicode-case-fold.py b/llvm/utils/unicode-case-fold.py index 9639aa0dc44b41..3ef12a0ef881a8 100755 --- a/llvm/utils/unicode-case-fold.py +++ b/llvm/utils/unicode-case-fold.py @@ -22,10 +22,7 @@ import sys import re -try: -from urllib.request import urlopen -except ImportError: -from urllib2 import urlopen +from urllib.request import urlopen # This variable will body of the mappings function >From d73faddf37c8d880f9f44a02a4df4290aac0f916 Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:00:30 +0530 Subject: [PATCH 2/3] Cleanup import --- clang/tools/scan-view/bin/scan-view | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/tools/scan-view/bin/scan-view b/clang/tools/scan-view/bin/scan-view index f8dc6c18018de1..d6b8c446ccfe8a 100755 --- a/clang/tools/scan-view/bin/scan-view +++ b/clang/tools/scan-view/bin/scan-view @@ -36,7 +36,6 @@ def url_is_up(url): def start_browser(port, options): -import webbrowser url = 'http://%s:%d' % (options.host, port) >From d377097e7df5a4933112e69cd49d1fe8f8980d05 Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:01:30 +0530 Subject: [PATCH 3/3] Update socketserver to python3 --- clang/tools/scan-view/bin/scan-view | 5 + 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/clang/tools/scan-view/bin/scan-view b/clang/tools/scan-view/bin/scan-view index d6b8c446ccfe8a..b63f494adfbe76 100755 --- a/clang/tools/scan-view/bin/scan-view +++ b/clang/tools/scan-view/bin/scan-view @@ -79,10 +79,7 @@ def run(port, options, root): def port_is_open(port): -try: -import socketserver -except ImportError: -import SocketServer as socketserver +import socketserver try: t = socketserver.TCPServer((kDefaultHost, port), None) except: ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
vinay-deshmukh wrote: Thanks @thurstond for the revert! Let me know if there's anything I can do here to help fix the issue! https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer] Handle [[assume(cond)]] as __builtin_assume(cond) (PR #116462)
vinay-deshmukh wrote: > We should have a look at what the codegen does with this attribute, or even > with the builtin assume call - because we should do something very similar. > We should gather the constraints and apply them, just like codegen does (I > assume). I think a suitable place to start reading would be CGStmt.cpp CodeGenFunction::EmitAttributedStmt(). > Basically, my idea now is more like: don't eval the expressions of the assume > in the CFG, but only visit the AttributedStmt in the ExprEngine. When we > would reach that, "do the same as codegen to get the constraints" and apply > these constraints. CodeGen seems to be doing a [NOOP operation when encountering an attribute with side-effects in `void CodeGenFunction::EmitAttributedStmt(const AttributedStmt &S) {`](https://github.com/llvm/llvm-project/blob/ab28d387fafede5d56a005b2597903fe6a2fbf9a/clang/lib/CodeGen/CGStmt.cpp#L756-L765). This can be mirrored within this PR by "ignore"-ing/(not adding those expressions as children) the assumption attributes (in CFG.cpp) that have side effects. I've checked the `debug.ViewCFG` output and it looks like this is similar to what `__builtin_assume` does if it's assumptions encounter expressions with side-effects. Furthermore, it appears to me that `clang` specifically NEVER evaluates assumptions that can have side-effects (See section at the end that compares GCC/clang behavior). We know it doesn't for codegen as per the above function, and given the `DiagnosticSemaKind.td`'s `warn_assume_side_effects` occurrence unconditionally, it would appear they aren't evaluated at all. (compliant with the standard). Once the other comments regarding `for` vs `if` is answered, I can raise a cleaned up PR with the necessary changes, that way it can be one commit. Comparison of GCC vs clang for compiler for pre-C++23 ASSUME macro and `[[assume()]]` Noting the current "real" behavior of `clang` and `gcc` **NOT** considering static analysis/checkers: https://godbolt.org/z/nM6PccseK This godbolt link shows the output of with the following scenarios, where the assumption argument is an expression with side-effects (`++y == 43`): 1. with the compiler builtin-assume equivalent (as per each compiler) as: ```c++ // From: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1774r8.pdf #if defined(__clang__) #define ASSUME(expr) __builtin_assume(expr) #elif defined(__GNUC__) && !defined(__ICC) #define ASSUME(expr) if (expr) {} else { __builtin_unreachable(); } #endif ``` a. U.B. (as per standard) i.e. `f(20)` takes `y != 42` * Clang: returns 20, (**DOES NOT EVALUATE the assumption as it has side-effects**) (via `DiagnosticsSemaKinds.td`) ``` If the condition is violated during execution, the behavior is undefined. The argument itself is never evaluated, so any side effects of the expression will be discarded. ``` from https://clang.llvm.org/docs/LanguageExtensions.html#builtin-assume Note: `int f(int)`'s assembly output contains `20`, as clang didn't evaluate `++y` * GCC: returns 139, terminates with SIGSEGV Note: `int f(int)`'s assembly output contains `43` since GCC evaluates `++y` ``` If control flow reaches the point of the __builtin_unreachable, the program is undefined. ``` from https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#index-_005f_005fbuiltin_005funreachable b. Defined Behavior i.e. `f()` takes 42 as input * Clang: returns 42, asm output has `42`, since clagn does **NOT** evaluate `++y` * GCC: returns 43, asm output has `43`, since GCC evaluates `++y` 2. with `[[assume]]` (by setting the preprocessor directive `CXX23_ASSUME` at the start of the code) a. U.B. (as per standard) i.e. `f(20)` takes `y != 42` [U.B. so no behavior is guaranteed anyway.](https://eel.is/c++draft/dcl.attr.assume#sentence-5) * Clang: `f()`'s ASM is reading from the parameter, `main()` returns `20` * GCC: `f()` 's ASM has `42`, but `main()` returns `20` b. Defined Behavior i.e. `f()` takes 42 as input Clang: `f()`'s ASM is reading from the parameter, `main()` returns `42` GCC: `f()`'s ASM has 42, `main()` returns 42 https://github.com/llvm/llvm-project/pull/116462 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:30:34 -0500 Subject: [PATCH 1/9] 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 0..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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:02 -0500 Subject: [PATCH 2/9] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:50 -0500 Subject: [PATCH 3/9] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:25:07 -0500 Subject: [PATCH 4/9] 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-deshm...@users.noreply.github.com> Date: Sun, 9 Mar 2025 14:14:37 -0400 Subject: [PATCH 5/9] 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 isSymbolAvai
[clang] Fixes: Can not use C99 function names as variable names in C89 (PR #129979)
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-deshm...@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:30:34 -0500 Subject: [PATCH 01/12] 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 0..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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:02 -0500 Subject: [PATCH 02/12] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:50 -0500 Subject: [PATCH 03/12] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:25:07 -0500 Subject: [PATCH 04/12] 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-deshm...@users.noreply.github.com> Date: Sun, 9 Mar 2025 14:14:37 -0400 Subject: [PATCH 05/12] 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 is
[clang] Fixes: Can not use C99 function names as variable names in C89 (PR #129979)
vinay-deshmukh wrote: > @frederick-vs-ja > > Any suggestions on how to go about making further progress on this one? Sort > of stuck right now. @frederick-vs-ja bump https://github.com/llvm/llvm-project/pull/129979 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] C89 doesn't have `math.h` functions (PR #129979)
vinay-deshmukh wrote: > > Essentially all of math.h doesn't exist until `C99`: > > https://en.cppreference.com/w/c/numeric/math/log > > You seemed to misread the page. `logf` and `logl` exist since C99, while > `log` exists since C89. @frederick-vs-ja My bad, I should have better clarified my previous comment. While `log` does exist since C89 _within _, it should be allowed for a `.c` to define `int log = 0;` because the `math.h` has not been included. Thereby, even if `double log(double);` exists in C89 (in `math.h`), it's not been declared in the current translation unit, so declaring a symbol with the same name as `log` seems to be valid IMO. GCC's behavior seems to be that even if builtins are "re-defined" it is allowed, _when_ there is no explicit include for `math.h` # Reference: I've made a godbolt link https://godbolt.org/z/zY76dWa84 with all the symbols on https://en.cppreference.com/w/c/numeric/math All panels have `-std=c89` in common and are the respective `trunk` versions. 1. Panel 1: GCC builds with warnings `[-Wbuiltin-declaration-mismatch]` 2. Panel 2: Clang builds (after passing non-default options, this PR will make those effective when using `-std=c89`) and no warnings despite `-Wall` 3. Panel 3: Clang fails to build (this issue) https://github.com/llvm/llvm-project/pull/129979 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@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 0..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-deshm...@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-deshm...@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-deshm...@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-deshm...@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 isSymbolAvai
[clang] C89 doesn't have `math.h` functions (PR #129979)
vinay-deshmukh wrote: I'm a bit confused about the whole what is not UB/IFNDR in C89, but is in C99. Based on my current understanding the simplest way to resolve the issue seems to what I've done as of: 7572c21 Is not define builtins for symbols available in C89? let me know if that looks good. https://github.com/llvm/llvm-project/pull/129979 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:30:34 -0500 Subject: [PATCH 1/4] 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 0..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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:02 -0500 Subject: [PATCH 2/4] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:50 -0500 Subject: [PATCH 3/4] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:25:07 -0500 Subject: [PATCH 4/4] 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)) ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] C89 doesn't have `math.h` functions (PR #129979)
https://github.com/vinay-deshmukh edited https://github.com/llvm/llvm-project/pull/129979 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] C89 doesn't have `math.h` functions (PR #129979)
https://github.com/vinay-deshmukh created https://github.com/llvm/llvm-project/pull/129979 Fixes #15522 >From e9c7869550d9fd1eba4d4d42ee644540e6b6d445 Mon Sep 17 00:00:00 2001 From: Vinay Deshmukh <32487576+vinay-deshm...@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:30:34 -0500 Subject: [PATCH 1/3] 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 0..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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:02 -0500 Subject: [PATCH 2/3] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:50 -0500 Subject: [PATCH 3/3] 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)) ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] C89 doesn't have `math.h` functions (PR #129979)
https://github.com/vinay-deshmukh edited https://github.com/llvm/llvm-project/pull/129979 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@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 0..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-deshm...@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-deshm...@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-deshm...@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-deshm...@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 isSymbolAvai
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:30:34 -0500 Subject: [PATCH 1/6] 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 0..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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:02 -0500 Subject: [PATCH 2/6] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:50 -0500 Subject: [PATCH 3/6] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:25:07 -0500 Subject: [PATCH 4/6] 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-deshm...@users.noreply.github.com> Date: Sun, 9 Mar 2025 14:14:37 -0400 Subject: [PATCH 5/6] 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 isSymbolAvai
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:30:34 -0500 Subject: [PATCH 01/11] 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 0..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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:02 -0500 Subject: [PATCH 02/11] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:50 -0500 Subject: [PATCH 03/11] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:25:07 -0500 Subject: [PATCH 04/11] 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-deshm...@users.noreply.github.com> Date: Sun, 9 Mar 2025 14:14:37 -0400 Subject: [PATCH 05/11] 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 is
[clang] Fixes: Can not use C99 function names as variable names in C89 (PR #129979)
https://github.com/vinay-deshmukh edited https://github.com/llvm/llvm-project/pull/129979 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:30:34 -0500 Subject: [PATCH 1/7] 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 0..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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:02 -0500 Subject: [PATCH 2/7] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:50 -0500 Subject: [PATCH 3/7] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:25:07 -0500 Subject: [PATCH 4/7] 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-deshm...@users.noreply.github.com> Date: Sun, 9 Mar 2025 14:14:37 -0400 Subject: [PATCH 5/7] 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 isSymbolAvai
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@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 0..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-deshm...@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-deshm...@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-deshm...@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-deshm...@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 isSymbolAvai
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:30:34 -0500 Subject: [PATCH 01/10] 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 0..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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:02 -0500 Subject: [PATCH 02/10] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:50 -0500 Subject: [PATCH 03/10] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:25:07 -0500 Subject: [PATCH 04/10] 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-deshm...@users.noreply.github.com> Date: Sun, 9 Mar 2025 14:14:37 -0400 Subject: [PATCH 05/10] 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 is
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:30:34 -0500 Subject: [PATCH 01/10] 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 0..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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:02 -0500 Subject: [PATCH 02/10] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:50 -0500 Subject: [PATCH 03/10] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:25:07 -0500 Subject: [PATCH 04/10] 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-deshm...@users.noreply.github.com> Date: Sun, 9 Mar 2025 14:14:37 -0400 Subject: [PATCH 05/10] 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 is
[clang] C89 doesn't have `math.h` functions (PR #129979)
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-deshm...@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:30:34 -0500 Subject: [PATCH 1/9] 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 0..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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:09:02 -0500 Subject: [PATCH 2/9] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:13:50 -0500 Subject: [PATCH 3/9] 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-deshm...@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:25:07 -0500 Subject: [PATCH 4/9] 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-deshm...@users.noreply.github.com> Date: Sun, 9 Mar 2025 14:14:37 -0400 Subject: [PATCH 5/9] 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 isSymbolAvai
[clang] Fixes: Can not use C99 function names as variable names in C89 (PR #129979)
vinay-deshmukh wrote: @frederick-vs-ja Any suggestions on how to go about making further progress on this one? Sort of stuck right now. https://github.com/llvm/llvm-project/pull/129979 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits