Skip to content

Commit 4b96b24

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:0e4ba47ca827 into origin/amd-gfx:79049930af88
Local branch origin/amd-gfx 7904993 Fix missing labels in -mattr=dumpcode output (llvm#1157) Remote branch main 0e4ba47 [clang-tidy] support to detect conversion in `make_optional` for `bugprone-optional-value-conversion` (llvm#130417)
2 parents 7904993 + 0e4ba47 commit 4b96b24

File tree

272 files changed

+15477
-14611
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

272 files changed

+15477
-14611
lines changed

clang-tools-extra/clang-tidy/bugprone/OptionalValueConversionCheck.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "../utils/OptionsUtils.h"
1313
#include "clang/AST/ASTContext.h"
1414
#include "clang/ASTMatchers/ASTMatchFinder.h"
15+
#include "clang/ASTMatchers/ASTMatchers.h"
1516
#include <array>
1617

1718
using namespace clang::ast_matchers;
@@ -31,6 +32,7 @@ constexpr std::array<StringRef, 2> MakeSmartPtrList{
3132
"::std::make_unique",
3233
"::std::make_shared",
3334
};
35+
constexpr StringRef MakeOptional = "::std::make_optional";
3436

3537
} // namespace
3638

@@ -83,9 +85,26 @@ void OptionalValueConversionCheck::registerMatchers(MatchFinder *Finder) {
8385
// known template methods in std
8486
callExpr(
8587
argumentCountIs(1),
86-
callee(functionDecl(
87-
matchers::matchesAnyListedName(MakeSmartPtrList),
88-
hasTemplateArgument(0, refersToType(BindOptionalType)))),
88+
anyOf(
89+
// match std::make_unique std::make_shared
90+
callee(functionDecl(
91+
matchers::matchesAnyListedName(MakeSmartPtrList),
92+
hasTemplateArgument(
93+
0, refersToType(BindOptionalType)))),
94+
// match first std::make_optional by limit argument count
95+
// (1) and template count (1).
96+
// 1. template< class T > constexpr
97+
// std::optional<decay_t<T>> make_optional(T&& value);
98+
// 2. template< class T, class... Args > constexpr
99+
// std::optional<T> make_optional(Args&&... args);
100+
callee(functionDecl(templateArgumentCountIs(1),
101+
hasName(MakeOptional),
102+
returns(BindOptionalType)))),
103+
hasArgument(0, OptionalDerefMatcher)),
104+
callExpr(
105+
106+
argumentCountIs(1),
107+
89108
hasArgument(0, OptionalDerefMatcher))),
90109
unless(anyOf(hasAncestor(typeLoc()),
91110
hasAncestor(expr(matchers::hasUnevaluatedContext())))))

clang-tools-extra/clang-tidy/modernize/UseDefaultMemberInitCheck.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ void UseDefaultMemberInitCheck::storeOptions(
194194
}
195195

196196
void UseDefaultMemberInitCheck::registerMatchers(MatchFinder *Finder) {
197+
auto ConstExpRef = varDecl(anyOf(isConstexpr(), isStaticStorageClass()));
198+
197199
auto InitBase =
198200
anyOf(stringLiteral(), characterLiteral(), integerLiteral(),
199201
unaryOperator(hasAnyOperatorName("+", "-"),
@@ -202,7 +204,7 @@ void UseDefaultMemberInitCheck::registerMatchers(MatchFinder *Finder) {
202204
unaryOperator(hasAnyOperatorName("+", "-"),
203205
hasUnaryOperand(floatLiteral())),
204206
cxxBoolLiteral(), cxxNullPtrLiteralExpr(), implicitValueInitExpr(),
205-
declRefExpr(to(enumConstantDecl())));
207+
declRefExpr(to(anyOf(enumConstantDecl(), ConstExpRef))));
206208

207209
auto Init =
208210
anyOf(initListExpr(anyOf(allOf(initCountIs(1), hasInit(0, InitBase)),

clang-tools-extra/clang-tidy/modernize/UseStdNumbersCheck.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,11 @@ struct MatchBuilder {
9191

9292
auto matchMathCall(const StringRef FunctionName,
9393
const Matcher<clang::Expr> ArgumentMatcher) const {
94+
auto HasAnyPrecisionName = hasAnyName(
95+
FunctionName, (FunctionName + "l").str(),
96+
(FunctionName + "f").str()); // Support long double(l) and float(f).
9497
return expr(ignoreParenAndFloatingCasting(
95-
callExpr(callee(functionDecl(hasName(FunctionName),
98+
callExpr(callee(functionDecl(HasAnyPrecisionName,
9699
hasParameter(0, hasType(isArithmetic())))),
97100
hasArgument(0, ArgumentMatcher))));
98101
}

clang-tools-extra/clangd/Preamble.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,6 @@ buildPreamble(PathRef FileName, CompilerInvocation CI,
673673
// Reset references to ref-counted-ptrs before executing the callbacks, to
674674
// prevent resetting them concurrently.
675675
PreambleDiagsEngine.reset();
676-
CI.DiagnosticOpts.reset();
677676

678677
// When building the AST for the main file, we do want the function
679678
// bodies.

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ New check aliases
112112
Changes in existing checks
113113
^^^^^^^^^^^^^^^^^^^^^^^^^^
114114

115+
- Improved :doc:`bugprone-optional-value-conversion
116+
<clang-tidy/checks/bugprone/optional-value-conversion>` check to detect
117+
conversion in argument of ``std::make_optional``.
118+
115119
- Improved :doc:`bugprone-string-constructor
116120
<clang-tidy/checks/bugprone/string-constructor>` check to find suspicious
117121
calls of ``std::string`` constructor with char pointer, start position and
@@ -142,10 +146,18 @@ Changes in existing checks
142146
<clang-tidy/checks/modernize/use-ranges>` check by updating suppress
143147
warnings logic for ``nullptr`` in ``std::find``.
144148

149+
- Improved :doc:`modernize-use-std-numbers
150+
<clang-tidy/checks/modernize/use-std-numbers>` check to support math
151+
functions of different precisions.
152+
145153
- Improved :doc:`misc-use-internal-linkage
146154
<clang-tidy/checks/misc/use-internal-linkage>` check by fix false positives
147155
for function or variable in header file which contains macro expansion.
148156

157+
- Improved :doc:`modernize-use-default-member-init
158+
<clang-tidy/checks/modernize/use-default-member-init>` check by matching
159+
``constexpr`` and ``static`` values on member initialization.
160+
149161
- Improved :doc:`performance/unnecessary-value-param
150162
<clang-tidy/checks/performance/unnecessary-value-param>` check performance by
151163
tolerating fix-it breaking compilation when functions is used as pointers

clang-tools-extra/test/clang-tidy/checkers/bugprone/optional-value-conversion-construct-from-std.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,19 @@ class unique_ptr {};
2727
template <typename type>
2828
class shared_ptr {};
2929

30+
template <typename T>
31+
class initializer_list {};
32+
3033
template <class T, class... Args> unique_ptr<T> make_unique(Args &&...args);
3134
template <class T, class... Args> shared_ptr<T> make_shared(Args &&...args);
3235

36+
template <class T>
37+
constexpr std::optional<__decay(T)> make_optional(T &&value);
38+
template <class T, class... Args>
39+
constexpr std::optional<T> make_optional(Args &&...args);
40+
template <class T, class U, class... Args>
41+
constexpr std::optional<T> make_optional(std::initializer_list<U> il, Args &&...args);
42+
3343
} // namespace std
3444

3545
struct A {
@@ -45,9 +55,12 @@ void invalid() {
4555
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: conversion from 'std::optional<int>' into 'int' and back into 'std::optional<int>', remove potentially error-prone optional dereference [bugprone-optional-value-conversion]
4656
std::make_shared<std::optional<int>>(opt.value());
4757
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: conversion from 'std::optional<int>' into 'int' and back into 'std::optional<int>', remove potentially error-prone optional dereference [bugprone-optional-value-conversion]
58+
std::make_optional(opt.value());
59+
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: conversion from 'std::optional<int>' into 'int' and back into 'std::optional<int>', remove potentially error-prone optional dereference [bugprone-optional-value-conversion]
4860
}
4961

5062
void valid() {
5163
std::make_unique<A>(opt.value());
5264
std::make_shared<A>(opt.value());
65+
std::make_optional<int>(opt.value());
5366
}

clang-tools-extra/test/clang-tidy/checkers/modernize/use-default-member-init.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,3 +518,22 @@ class ArrayBraceInitMultipleValues {
518518
};
519519

520520
} // namespace PR63285
521+
522+
namespace PR122480 {
523+
524+
static int STATIC_VAL = 23;
525+
constexpr const char* CONSTEXPR_REF = "Const";
526+
527+
class StaticConstExprInit {
528+
529+
StaticConstExprInit() : a{CONSTEXPR_REF}, b{STATIC_VAL}{}
530+
// CHECK-FIXES: StaticConstExprInit() {}
531+
const char* a;
532+
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use default member initializer for 'a' [modernize-use-default-member-init]
533+
// CHECK-FIXES: const char* a{CONSTEXPR_REF};
534+
int b;
535+
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use default member initializer for 'b' [modernize-use-default-member-init]
536+
// CHECK-FIXES: int b{STATIC_VAL};
537+
};
538+
539+
} //namespace PR122480

clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-numbers.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,17 @@ namespace bar {
99
template <typename T>
1010
auto sqrt(T val) { return sqrt(static_cast<double>(val)); }
1111

12+
float sqrtf(float Arg);
13+
long double sqrtl(long double Arg);
14+
1215
static constexpr double e = 2.718281828459045235360287471352662497757247093;
1316
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:33: warning: prefer 'std::numbers::e' to this literal, differs by '0.00e+00' [modernize-use-std-numbers]
1417
// CHECK-FIXES-ALL: static constexpr double e = std::numbers::e;
1518
}
1619

20+
float expf(float Arg);
1721
double exp(double Arg);
22+
long double expl(long double Arg);
1823
double log(double Arg);
1924

2025
double log2(double Arg);
@@ -110,6 +115,14 @@ void foo(){
110115
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2_v<float>' to this formula [modernize-use-std-numbers]
111116
// CHECK-FIXES-ALL: std::numbers::sqrt2_v<float>;
112117

118+
bar::sqrtf(2.0F);
119+
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2_v<float>' to this formula [modernize-use-std-numbers]
120+
// CHECK-FIXES-ALL: std::numbers::sqrt2_v<float>;
121+
122+
bar::sqrtl(2.0);
123+
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2_v<long double>' to this formula [modernize-use-std-numbers]
124+
// CHECK-FIXES-ALL: std::numbers::sqrt2_v<long double>;
125+
113126
sink(MY_PI);
114127
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::pi' to this macro, differs by '5.36e-08' [modernize-use-std-numbers]
115128
// CHECK-FIXES-ALL: sink(std::numbers::pi);
@@ -155,6 +168,14 @@ void foo(){
155168
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]
156169
// CHECK-FIXES-ALL: std::numbers::e;
157170

171+
expf(1);
172+
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e_v<float>' to this formula [modernize-use-std-numbers]
173+
// CHECK-FIXES-ALL: std::numbers::e_v<float>;
174+
175+
expl(1);
176+
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e_v<long double>' to this formula [modernize-use-std-numbers]
177+
// CHECK-FIXES-ALL: std::numbers::e_v<long double>;
178+
158179
log2(exp(1));
159180
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers]
160181
// CHECK-MESSAGES-ALL: :[[@LINE-2]]:10: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]

clang/docs/LibASTMatchersReference.html

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4108,8 +4108,14 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
41084108
Given
41094109
template&lt;typename T&gt; struct C {};
41104110
C&lt;int&gt; c;
4111+
template&lt;typename T&gt; void f() {}
4112+
void func() { f&lt;int&gt;(); };
4113+
41114114
classTemplateSpecializationDecl(templateArgumentCountIs(1))
41124115
matches C&lt;int&gt;.
4116+
4117+
functionDecl(templateArgumentCountIs(1))
4118+
matches f&lt;int&gt;();
41134119
</pre></td></tr>
41144120

41154121

@@ -4833,6 +4839,23 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
48334839
</pre></td></tr>
48344840

48354841

4842+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs2')"><a name="templateArgumentCountIs2Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
4843+
<tr><td colspan="4" class="doc" id="templateArgumentCountIs2"><pre>Matches if the number of template arguments equals N.
4844+
4845+
Given
4846+
template&lt;typename T&gt; struct C {};
4847+
C&lt;int&gt; c;
4848+
template&lt;typename T&gt; void f() {}
4849+
void func() { f&lt;int&gt;(); };
4850+
4851+
classTemplateSpecializationDecl(templateArgumentCountIs(1))
4852+
matches C&lt;int&gt;.
4853+
4854+
functionDecl(templateArgumentCountIs(1))
4855+
matches f&lt;int&gt;();
4856+
</pre></td></tr>
4857+
4858+
48364859
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
48374860
<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
48384861

@@ -5783,14 +5806,20 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
57835806
</pre></td></tr>
57845807

57855808

5786-
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
5787-
<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5809+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs3')"><a name="templateArgumentCountIs3Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
5810+
<tr><td colspan="4" class="doc" id="templateArgumentCountIs3"><pre>Matches if the number of template arguments equals N.
57885811

57895812
Given
57905813
template&lt;typename T&gt; struct C {};
57915814
C&lt;int&gt; c;
5815+
template&lt;typename T&gt; void f() {}
5816+
void func() { f&lt;int&gt;(); };
5817+
57925818
classTemplateSpecializationDecl(templateArgumentCountIs(1))
57935819
matches C&lt;int&gt;.
5820+
5821+
functionDecl(templateArgumentCountIs(1))
5822+
matches f&lt;int&gt;();
57945823
</pre></td></tr>
57955824

57965825

@@ -6219,6 +6248,23 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
62196248
Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
62206249
</pre></td></tr>
62216250

6251+
6252+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarTemplateSpecializationDecl.html">VarTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
6253+
<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
6254+
6255+
Given
6256+
template&lt;typename T&gt; struct C {};
6257+
C&lt;int&gt; c;
6258+
template&lt;typename T&gt; void f() {}
6259+
void func() { f&lt;int&gt;(); };
6260+
6261+
classTemplateSpecializationDecl(templateArgumentCountIs(1))
6262+
matches C&lt;int&gt;.
6263+
6264+
functionDecl(templateArgumentCountIs(1))
6265+
matches f&lt;int&gt;();
6266+
</pre></td></tr>
6267+
62226268
<!--END_NARROWING_MATCHERS -->
62236269
</table>
62246270

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,8 @@ AST Matchers
397397
------------
398398

399399
- Ensure ``isDerivedFrom`` matches the correct base in case more than one alias exists.
400+
- Extend ``templateArgumentCountIs`` to support function and variable template
401+
specialization.
400402

401403
clang-format
402404
------------

0 commit comments

Comments
 (0)