mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-14 19:49:36 +00:00
[analyzer][UninitializedObjectChecker] PR41611: Regard vector types as primitive
https://bugs.llvm.org/show_bug.cgi?id=41611 Similarly to D61106, the checker ran over an llvm_unreachable for vector types: struct VectorSizeLong { VectorSizeLong() {} __attribute__((__vector_size__(16))) long x; }; void __vector_size__LongTest() { VectorSizeLong v; } Since, according to my short research, "The vector_size attribute is only applicable to integral and float scalars, although arrays, pointers, and function return values are allowed in conjunction with this construct." [src: https://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Vector-Extensions.html#Vector-Extensions] vector types are safe to regard as primitive. Differential Revision: https://reviews.llvm.org/D61246 llvm-svn: 359539
This commit is contained in:
parent
f74a4c1f6d
commit
c21ec00d28
@ -324,7 +324,8 @@ private:
|
||||
inline bool isPrimitiveType(const QualType &T) {
|
||||
return T->isBuiltinType() || T->isEnumeralType() ||
|
||||
T->isMemberPointerType() || T->isBlockPointerType() ||
|
||||
T->isFunctionType() || T->isAtomicType();
|
||||
T->isFunctionType() || T->isAtomicType() ||
|
||||
T->isVectorType();
|
||||
}
|
||||
|
||||
inline bool isDereferencableType(const QualType &T) {
|
||||
|
@ -256,6 +256,29 @@ void fCharPointerTest() {
|
||||
CharPointerTest();
|
||||
}
|
||||
|
||||
struct VectorSizePointer {
|
||||
VectorSizePointer() {} // expected-warning{{1 uninitialized field}}
|
||||
__attribute__((__vector_size__(8))) int *x; // expected-note{{uninitialized pointer 'this->x'}}
|
||||
int dontGetFilteredByNonPedanticMode = 0;
|
||||
};
|
||||
|
||||
void __vector_size__PointerTest() {
|
||||
VectorSizePointer v;
|
||||
}
|
||||
|
||||
struct VectorSizePointee {
|
||||
using MyVectorType = __attribute__((__vector_size__(8))) int;
|
||||
MyVectorType *x;
|
||||
|
||||
VectorSizePointee(decltype(x) x) : x(x) {}
|
||||
};
|
||||
|
||||
void __vector_size__PointeeTest() {
|
||||
VectorSizePointee::MyVectorType i;
|
||||
// TODO: Report v.x's pointee.
|
||||
VectorSizePointee v(&i);
|
||||
}
|
||||
|
||||
struct CyclicPointerTest1 {
|
||||
int *ptr; // expected-note{{object references itself 'this->ptr'}}
|
||||
int dontGetFilteredByNonPedanticMode = 0;
|
||||
|
@ -1132,7 +1132,7 @@ void fCXX11MemberInitTest2() {
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// _Atomic tests.
|
||||
// "Esoteric" primitive type tests.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
struct MyAtomicInt {
|
||||
@ -1142,6 +1142,17 @@ struct MyAtomicInt {
|
||||
MyAtomicInt() {} // expected-warning{{1 uninitialized field}}
|
||||
};
|
||||
|
||||
void entry() {
|
||||
void _AtomicTest() {
|
||||
MyAtomicInt b;
|
||||
}
|
||||
|
||||
struct VectorSizeLong {
|
||||
VectorSizeLong() {}
|
||||
__attribute__((__vector_size__(16))) long x;
|
||||
};
|
||||
|
||||
void __vector_size__LongTest() {
|
||||
// TODO: Warn for v.x.
|
||||
VectorSizeLong v;
|
||||
v.x[0] = 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user