CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
457 lines
20 KiB
C++
457 lines
20 KiB
C++
// RUN: %check_clang_tidy %s readability-qualified-auto %t \
|
|
// RUN: -config='{CheckOptions: { \
|
|
// RUN: readability-qualified-auto.AllowedTypes: "[iI]terator$;my::ns::Ignored1;std::array<.*>::Ignored2;MyIgnoredPtr" \
|
|
// RUN: }}'
|
|
// RUN: %check_clang_tidy %s readability-qualified-auto %t \
|
|
// RUN: -config='{CheckOptions: { \
|
|
// RUN: readability-qualified-auto.AllowedTypes: "[iI]terator$;my::ns::Ignored1;std::array<.*>::Ignored2;MyIgnoredPtr", \
|
|
// RUN: readability-qualified-auto.IgnoreAliasing: false \
|
|
// RUN: }}' -check-suffix=ALIAS
|
|
namespace typedefs {
|
|
typedef int *MyPtr;
|
|
typedef int &MyRef;
|
|
typedef const int *CMyPtr;
|
|
typedef const int &CMyRef;
|
|
|
|
MyPtr getPtr();
|
|
MyPtr* getPtrPtr();
|
|
MyRef getRef();
|
|
CMyPtr getCPtr();
|
|
CMyPtr* getCPtrPtr();
|
|
CMyRef getCRef();
|
|
|
|
void foo() {
|
|
auto TdNakedPtr = getPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedPtr' can be declared as 'auto *TdNakedPtr'
|
|
// CHECK-FIXES: auto *TdNakedPtr = getPtr();
|
|
auto TdNakedPtrPtr = getPtrPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedPtrPtr' can be declared as 'auto *TdNakedPtrPtr'
|
|
// CHECK-FIXES: auto *TdNakedPtrPtr = getPtrPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto TdNakedPtrPtr' can be declared as 'auto *TdNakedPtrPtr'
|
|
// CHECK-FIXES-ALIAS: auto *TdNakedPtrPtr = getPtrPtr();
|
|
auto &TdNakedRef = getRef();
|
|
auto TdNakedRefDeref = getRef();
|
|
auto TdNakedCPtr = getCPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedCPtr' can be declared as 'const auto *TdNakedCPtr'
|
|
// CHECK-FIXES: const auto *TdNakedCPtr = getCPtr();
|
|
auto TdNakedCPtrPtr = getCPtrPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedCPtrPtr' can be declared as 'auto *TdNakedCPtrPtr'
|
|
// CHECK-FIXES: auto *TdNakedCPtrPtr = getCPtrPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto TdNakedCPtrPtr' can be declared as 'auto *TdNakedCPtrPtr'
|
|
// CHECK-FIXES-ALIAS: auto *TdNakedCPtrPtr = getCPtrPtr();
|
|
auto &TdNakedCRef = getCRef();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto &TdNakedCRef' can be declared as 'const auto &TdNakedCRef'
|
|
// CHECK-FIXES: const auto &TdNakedCRef = getCRef();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto &TdNakedCRef' can be declared as 'const auto &TdNakedCRef'
|
|
// CHECK-FIXES-ALIAS: const auto &TdNakedCRef = getCRef();
|
|
auto TdNakedCRefDeref = getCRef();
|
|
}
|
|
|
|
}; // namespace typedefs
|
|
|
|
namespace usings {
|
|
using MyPtr = int *;
|
|
using MyRef = int &;
|
|
using CMyPtr = const int *;
|
|
using CMyRef = const int &;
|
|
|
|
MyPtr getPtr();
|
|
MyPtr* getPtrPtr();
|
|
MyRef getRef();
|
|
CMyPtr getCPtr();
|
|
CMyRef getCRef();
|
|
|
|
void foo() {
|
|
auto UNakedPtr = getPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto UNakedPtr' can be declared as 'auto *UNakedPtr'
|
|
// CHECK-FIXES: auto *UNakedPtr = getPtr();
|
|
auto UNakedPtrPtr = getPtrPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto UNakedPtrPtr' can be declared as 'auto *UNakedPtrPtr'
|
|
// CHECK-FIXES: auto *UNakedPtrPtr = getPtrPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto UNakedPtrPtr' can be declared as 'auto *UNakedPtrPtr'
|
|
// CHECK-FIXES-ALIAS: auto *UNakedPtrPtr = getPtrPtr();
|
|
auto &UNakedRef = getRef();
|
|
auto UNakedRefDeref = getRef();
|
|
auto UNakedCPtr = getCPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto UNakedCPtr' can be declared as 'const auto *UNakedCPtr'
|
|
// CHECK-FIXES: const auto *UNakedCPtr = getCPtr();
|
|
auto &UNakedCRef = getCRef();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto &UNakedCRef' can be declared as 'const auto &UNakedCRef'
|
|
// CHECK-FIXES: const auto &UNakedCRef = getCRef();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto &UNakedCRef' can be declared as 'const auto &UNakedCRef'
|
|
// CHECK-FIXES-ALIAS: const auto &UNakedCRef = getCRef();
|
|
auto UNakedCRefDeref = getCRef();
|
|
}
|
|
|
|
}; // namespace usings
|
|
|
|
int getInt();
|
|
int *getIntPtr();
|
|
const int *getCIntPtr();
|
|
|
|
void foo() {
|
|
// make sure check disregards named types
|
|
int TypedInt = getInt();
|
|
int *TypedPtr = getIntPtr();
|
|
const int *TypedConstPtr = getCIntPtr();
|
|
int &TypedRef = *getIntPtr();
|
|
const int &TypedConstRef = *getCIntPtr();
|
|
|
|
// make sure check disregards auto types that aren't pointers or references
|
|
auto AutoInt = getInt();
|
|
|
|
auto NakedPtr = getIntPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto NakedPtr' can be declared as 'auto *NakedPtr'
|
|
// CHECK-FIXES: auto *NakedPtr = getIntPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto NakedPtr' can be declared as 'auto *NakedPtr'
|
|
// CHECK-FIXES-ALIAS: auto *NakedPtr = getIntPtr();
|
|
auto NakedCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto NakedCPtr' can be declared as 'const auto *NakedCPtr'
|
|
// CHECK-FIXES: const auto *NakedCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto NakedCPtr' can be declared as 'const auto *NakedCPtr'
|
|
// CHECK-FIXES-ALIAS: const auto *NakedCPtr = getCIntPtr();
|
|
|
|
const auto ConstPtr = getIntPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'const auto ConstPtr' can be declared as 'auto *const ConstPtr'
|
|
// CHECK-FIXES: auto *const ConstPtr = getIntPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'const auto ConstPtr' can be declared as 'auto *const ConstPtr'
|
|
// CHECK-FIXES-ALIAS: auto *const ConstPtr = getIntPtr();
|
|
const auto ConstCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'const auto ConstCPtr' can be declared as 'const auto *const ConstCPtr'
|
|
// CHECK-FIXES: const auto *const ConstCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'const auto ConstCPtr' can be declared as 'const auto *const ConstCPtr'
|
|
// CHECK-FIXES-ALIAS: const auto *const ConstCPtr = getCIntPtr();
|
|
|
|
volatile auto VolatilePtr = getIntPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'volatile auto VolatilePtr' can be declared as 'auto *volatile VolatilePtr'
|
|
// CHECK-FIXES: auto *volatile VolatilePtr = getIntPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'volatile auto VolatilePtr' can be declared as 'auto *volatile VolatilePtr'
|
|
// CHECK-FIXES-ALIAS: auto *volatile VolatilePtr = getIntPtr();
|
|
volatile auto VolatileCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'volatile auto VolatileCPtr' can be declared as 'const auto *volatile VolatileCPtr'
|
|
// CHECK-FIXES: const auto *volatile VolatileCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'volatile auto VolatileCPtr' can be declared as 'const auto *volatile VolatileCPtr'
|
|
// CHECK-FIXES-ALIAS: const auto *volatile VolatileCPtr = getCIntPtr();
|
|
|
|
auto *QualPtr = getIntPtr();
|
|
auto *QualCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto *QualCPtr' can be declared as 'const auto *QualCPtr'
|
|
// CHECK-FIXES: const auto *QualCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto *QualCPtr' can be declared as 'const auto *QualCPtr'
|
|
// CHECK-FIXES-ALIAS: const auto *QualCPtr = getCIntPtr();
|
|
auto *const ConstantQualCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto *const ConstantQualCPtr' can be declared as 'const auto *const ConstantQualCPtr'
|
|
// CHECK-FIXES: const auto *const ConstantQualCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto *const ConstantQualCPtr' can be declared as 'const auto *const ConstantQualCPtr'
|
|
// CHECK-FIXES-ALIAS: const auto *const ConstantQualCPtr = getCIntPtr();
|
|
auto *volatile VolatileQualCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto *volatile VolatileQualCPtr' can be declared as 'const auto *volatile VolatileQualCPtr'
|
|
// CHECK-FIXES: const auto *volatile VolatileQualCPtr = getCIntPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto *volatile VolatileQualCPtr' can be declared as 'const auto *volatile VolatileQualCPtr'
|
|
// CHECK-FIXES-ALIAS: const auto *volatile VolatileQualCPtr = getCIntPtr();
|
|
const auto *ConstQualCPtr = getCIntPtr();
|
|
|
|
auto &Ref = *getIntPtr();
|
|
auto &CRef = *getCIntPtr();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto &CRef' can be declared as 'const auto &CRef'
|
|
// CHECK-FIXES: const auto &CRef = *getCIntPtr();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto &CRef' can be declared as 'const auto &CRef'
|
|
// CHECK-FIXES-ALIAS: const auto &CRef = *getCIntPtr();
|
|
const auto &ConstCRef = *getCIntPtr();
|
|
|
|
if (auto X = getCIntPtr()) {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'auto X' can be declared as 'const auto *X'
|
|
// CHECK-FIXES: if (const auto *X = getCIntPtr()) {
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:7: warning: 'auto X' can be declared as 'const auto *X'
|
|
// CHECK-FIXES-ALIAS: if (const auto *X = getCIntPtr()) {
|
|
}
|
|
}
|
|
|
|
void macroTest() {
|
|
#define _AUTO auto
|
|
#define _CONST const
|
|
_AUTO AutoMACROPtr = getIntPtr();
|
|
const _AUTO ConstAutoMacroPtr = getIntPtr();
|
|
_CONST _AUTO ConstMacroAutoMacroPtr = getIntPtr();
|
|
_CONST auto ConstMacroAutoPtr = getIntPtr();
|
|
#undef _AUTO
|
|
#undef _CONST
|
|
}
|
|
|
|
#include <vector>
|
|
|
|
void change(int &);
|
|
void observe(const int &);
|
|
|
|
void loopRef(std::vector<int> &Mutate, const std::vector<int> &Constant) {
|
|
for (auto &Data : Mutate) {
|
|
change(Data);
|
|
}
|
|
for (auto &Data : Constant) {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto &Data' can be declared as 'const auto &Data'
|
|
// CHECK-FIXES: for (const auto &Data : Constant) {
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto &Data' can be declared as 'const auto &Data'
|
|
// CHECK-FIXES-ALIAS: for (const auto &Data : Constant) {
|
|
observe(Data);
|
|
}
|
|
}
|
|
|
|
void loopPtr(const std::vector<int *> &Mutate, const std::vector<const int *> &Constant) {
|
|
for (auto Data : Mutate) {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'auto *Data'
|
|
// CHECK-FIXES: for (auto *Data : Mutate) {
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'auto *Data'
|
|
// CHECK-FIXES-ALIAS: for (auto *Data : Mutate) {
|
|
change(*Data);
|
|
}
|
|
for (auto Data : Constant) {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'const auto *Data'
|
|
// CHECK-FIXES: for (const auto *Data : Constant) {
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'const auto *Data'
|
|
// CHECK-FIXES-ALIAS: for (const auto *Data : Constant) {
|
|
observe(*Data);
|
|
}
|
|
}
|
|
|
|
template <typename T>
|
|
void tempLoopPtr(std::vector<T *> &MutateTemplate, std::vector<const T *> &ConstantTemplate) {
|
|
for (auto Data : MutateTemplate) {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'auto *Data'
|
|
// CHECK-FIXES: for (auto *Data : MutateTemplate) {
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'auto *Data'
|
|
// CHECK-FIXES-ALIAS: for (auto *Data : MutateTemplate) {
|
|
change(*Data);
|
|
}
|
|
//FixMe
|
|
for (auto Data : ConstantTemplate) {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'const auto *Data'
|
|
// CHECK-FIXES: for (const auto *Data : ConstantTemplate) {
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'const auto *Data'
|
|
// CHECK-FIXES-ALIAS: for (const auto *Data : ConstantTemplate) {
|
|
observe(*Data);
|
|
}
|
|
}
|
|
|
|
template <typename T>
|
|
class TemplateLoopPtr {
|
|
public:
|
|
void operator()(const std::vector<T *> &MClassTemplate, const std::vector<const T *> &CClassTemplate) {
|
|
for (auto Data : MClassTemplate) {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: 'auto Data' can be declared as 'auto *Data'
|
|
// CHECK-FIXES: for (auto *Data : MClassTemplate) {
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:10: warning: 'auto Data' can be declared as 'auto *Data'
|
|
// CHECK-FIXES-ALIAS: for (auto *Data : MClassTemplate) {
|
|
change(*Data);
|
|
}
|
|
//FixMe
|
|
for (auto Data : CClassTemplate) {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: 'auto Data' can be declared as 'const auto *Data'
|
|
// CHECK-FIXES: for (const auto *Data : CClassTemplate) {
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:10: warning: 'auto Data' can be declared as 'const auto *Data'
|
|
// CHECK-FIXES-ALIAS: for (const auto *Data : CClassTemplate) {
|
|
observe(*Data);
|
|
}
|
|
}
|
|
};
|
|
|
|
void bar() {
|
|
std::vector<int> Vec;
|
|
std::vector<int *> PtrVec;
|
|
std::vector<const int *> CPtrVec;
|
|
loopRef(Vec, Vec);
|
|
loopPtr(PtrVec, CPtrVec);
|
|
tempLoopPtr(PtrVec, CPtrVec);
|
|
TemplateLoopPtr<int>()(PtrVec, CPtrVec);
|
|
}
|
|
|
|
typedef int *(*functionRetPtr)();
|
|
typedef int (*functionRetVal)();
|
|
|
|
functionRetPtr getPtrFunction();
|
|
functionRetVal getValFunction();
|
|
|
|
void baz() {
|
|
auto MyFunctionPtr = getPtrFunction();
|
|
// CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto MyFunctionPtr' can be declared as 'auto *MyFunctionPtr'
|
|
// CHECK-FIXES-NOT: auto *MyFunctionPtr = getPtrFunction();
|
|
// CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-1]]:3: warning: 'auto MyFunctionPtr' can be declared as 'auto *MyFunctionPtr'
|
|
// CHECK-FIXES-NOT-ALIAS: auto *MyFunctionPtr = getPtrFunction();
|
|
auto MyFunctionVal = getValFunction();
|
|
// CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto MyFunctionVal' can be declared as 'auto *MyFunctionVal'
|
|
// CHECK-FIXES-NOT: auto *MyFunctionVal = getValFunction();
|
|
// CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto MyFunctionVal' can be declared as 'auto *MyFunctionVal'
|
|
// CHECK-FIXES-NOT-ALIAS: auto *MyFunctionVal = getValFunction();
|
|
|
|
auto LambdaTest = [] { return 0; };
|
|
// CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto LambdaTest' can be declared as 'auto *LambdaTest'
|
|
// CHECK-FIXES-NOT: auto *LambdaTest = [] { return 0; };
|
|
// CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto LambdaTest' can be declared as 'auto *LambdaTest'
|
|
// CHECK-FIXES-NOT-ALIAS: auto *LambdaTest = [] { return 0; };
|
|
|
|
auto LambdaTest2 = +[] { return 0; };
|
|
// CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto LambdaTest2' can be declared as 'auto *LambdaTest2'
|
|
// CHECK-FIXES-NOT: auto *LambdaTest2 = +[] { return 0; };
|
|
// CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto LambdaTest2' can be declared as 'auto *LambdaTest2'
|
|
// CHECK-FIXES-NOT-ALIAS: auto *LambdaTest2 = +[] { return 0; };
|
|
|
|
auto MyFunctionRef = *getPtrFunction();
|
|
// CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto MyFunctionRef' can be declared as 'auto *MyFunctionRef'
|
|
// CHECK-FIXES-NOT: auto *MyFunctionRef = *getPtrFunction();
|
|
// CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto MyFunctionRef' can be declared as 'auto *MyFunctionRef'
|
|
// CHECK-FIXES-NOT-ALIAS: auto *MyFunctionRef = *getPtrFunction();
|
|
|
|
auto &MyFunctionRef2 = *getPtrFunction();
|
|
}
|
|
|
|
namespace std {
|
|
|
|
template<typename T, int N>
|
|
struct array {
|
|
typedef T value_type;
|
|
|
|
typedef value_type* iterator;
|
|
typedef value_type* Iterator;
|
|
using using_iterator = T*;
|
|
typedef const value_type* const_iterator;
|
|
typedef const value_type* constIterator;
|
|
|
|
struct Ignored2 {};
|
|
using NotIgnored2 = Ignored2;
|
|
|
|
iterator begin() { return nullptr; }
|
|
const_iterator begin() const { return nullptr; }
|
|
iterator end() { return nullptr; }
|
|
const_iterator end() const { return nullptr; }
|
|
};
|
|
|
|
struct Iterator {};
|
|
|
|
struct Ignored2 {}; // should not be ignored
|
|
|
|
} // namespace std
|
|
|
|
typedef std::Iterator iterator;
|
|
|
|
namespace my {
|
|
namespace ns {
|
|
|
|
struct Ignored1 {};
|
|
|
|
using NotIgnored1 = Ignored1;
|
|
typedef Ignored1 NotIgnored2;
|
|
|
|
} // namespace ns
|
|
|
|
struct Ignored1 {}; // should not be ignored
|
|
|
|
} // namespace my
|
|
|
|
typedef int *MyIgnoredPtr;
|
|
MyIgnoredPtr getIgnoredPtr();
|
|
|
|
void ignored_types() {
|
|
auto ignored_ptr = getIgnoredPtr();
|
|
// CHECK-MESSAGES-NOT: warning: 'auto ignored_ptr' can be declared as 'auto *ignored_ptr'
|
|
// CHECK-FIXES-NOT: auto *ignored_ptr = getIgnoredPtr();
|
|
|
|
std::array<int, 4> arr;
|
|
std::array<int, 4> carr;
|
|
|
|
auto it1 = arr.begin();
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it' can be declared as 'auto *it'
|
|
// CHECK-FIXES-NOT: auto *it = vec.it_begin();
|
|
|
|
auto it2 = carr.begin();
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it2' can be declared as 'auto *it2'
|
|
// CHECK-FIXES-NOT: auto *it2 = carr.begin();
|
|
|
|
auto it3 = std::array<int, 4>::iterator{};
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it3' can be declared as 'auto *it3'
|
|
// CHECK-FIXES-NOT: auto *it3 = std::array<int, 4>::iterator{};
|
|
|
|
auto it4 = std::array<int, 4>::Iterator{};
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it4' can be declared as 'auto *it4'
|
|
// CHECK-FIXES-NOT: auto *it4 = std::array<int, 4>::Iterator{};
|
|
|
|
auto it5 = std::array<int, 4>::using_iterator{};
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it5' can be declared as 'auto *it5'
|
|
// CHECK-FIXES-NOT: auto *it5 = std::array<int, 4>::using_iterator{};
|
|
|
|
auto it6 = std::array<int, 4>::const_iterator{};
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it6' can be declared as 'auto *it6'
|
|
// CHECK-FIXES-NOT: auto *it6 = std::array<int, 4>::const_iterator{};
|
|
|
|
auto it7 = std::array<int, 4>::constIterator{};
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it7' can be declared as 'auto *it7'
|
|
// CHECK-FIXES-NOT: auto *it7 = std::array<int, 4>::constIterator{};
|
|
|
|
auto it8 = new std::Iterator();
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it8' can be declared as 'auto *it8'
|
|
// CHECK-FIXES-NOT: auto *it8 = new std::Iterator();
|
|
|
|
auto it9 = new iterator();
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it9' can be declared as 'auto *it9'
|
|
// CHECK-FIXES-NOT: auto *it9 = new iterator();
|
|
|
|
auto arr_ignored2 = new std::array<int, 4>::Ignored2();
|
|
// CHECK-MESSAGES-NOT: warning: 'auto arr_ignored2' can be declared as 'auto *arr_ignored2'
|
|
// CHECK-FIXES-NOT: auto *arr_ignored2 = new std::array<int, 4>::Ignored2();
|
|
|
|
auto arr_not_ignored2 = new std::array<int, 4>::NotIgnored2();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto arr_not_ignored2' can be declared as 'auto *arr_not_ignored2'
|
|
// CHECK-FIXES: auto *arr_not_ignored2 = new std::array<int, 4>::NotIgnored2();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto arr_not_ignored2' can be declared as 'auto *arr_not_ignored2'
|
|
// CHECK-FIXES-ALIAS: auto *arr_not_ignored2 = new std::array<int, 4>::NotIgnored2();
|
|
|
|
auto not_ignored2 = new std::Ignored2();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not_ignored2' can be declared as 'auto *not_ignored2'
|
|
// CHECK-FIXES: auto *not_ignored2 = new std::Ignored2();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not_ignored2' can be declared as 'auto *not_ignored2'
|
|
// CHECK-FIXES-ALIAS: auto *not_ignored2 = new std::Ignored2();
|
|
|
|
auto ignored1 = new my::ns::Ignored1();
|
|
// CHECK-MESSAGES-NOT: warning: 'auto ignored1' can be declared as 'auto *ignored1'
|
|
// CHECK-FIXES-NOT: auto *ignored1 = new my::ns::Ignored1();
|
|
|
|
auto not_ignored1 = new my::ns::NotIgnored1();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not_ignored1' can be declared as 'auto *not_ignored1'
|
|
// CHECK-FIXES: auto *not_ignored1 = new my::ns::NotIgnored1();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not_ignored1' can be declared as 'auto *not_ignored1'
|
|
// CHECK-FIXES-ALIAS: auto *not_ignored1 = new my::ns::NotIgnored1();
|
|
|
|
auto not2_ignored1 = new my::ns::NotIgnored2();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not2_ignored1' can be declared as 'auto *not2_ignored1'
|
|
// CHECK-FIXES: auto *not2_ignored1 = new my::ns::NotIgnored2();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not2_ignored1' can be declared as 'auto *not2_ignored1'
|
|
// CHECK-FIXES-ALIAS: auto *not2_ignored1 = new my::ns::NotIgnored2();
|
|
|
|
auto not3_ignored1 = new my::Ignored1();
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not3_ignored1' can be declared as 'auto *not3_ignored1'
|
|
// CHECK-FIXES: auto *not3_ignored1 = new my::Ignored1();
|
|
// CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not3_ignored1' can be declared as 'auto *not3_ignored1'
|
|
// CHECK-FIXES-ALIAS: auto *not3_ignored1 = new my::Ignored1();
|
|
}
|
|
|
|
template <typename T>
|
|
void ignored_types_template(std::array<T, 4> arr, const std::array<T, 4>& carr) {
|
|
auto it1 = arr.begin();
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it' can be declared as 'auto *it'
|
|
// CHECK-FIXES-NOT: auto *it = arr.it_begin();
|
|
|
|
auto it2 = carr.begin();
|
|
// CHECK-MESSAGES-NOT: warning: 'auto it2' can be declared as 'auto *it2'
|
|
// CHECK-FIXES-NOT: auto *it2 = carr.begin();
|
|
|
|
for (auto Data : arr) {
|
|
// CHECK-MESSAGES-NOT: warning: 'auto Data' can be declared as 'auto *Data'
|
|
// CHECK-FIXES-NOT: for (auto *Data : MClassTemplate) {
|
|
change(*Data);
|
|
}
|
|
|
|
for (auto Data : carr) {
|
|
// CHECK-MESSAGES-NOT: warning: 'auto Data' can be declared as 'const auto *Data'
|
|
// CHECK-FIXES-NOT: for (const auto *Data : MClassTemplate) {
|
|
change(*Data);
|
|
}
|
|
}
|