Szelethus created this revision. Szelethus added reviewers: NoQ, dcoughlin, xazax.hun, rnkovacs, baloghadamsoftware, Charusso, alexfh, gribozavr. Szelethus added a project: clang. Herald added subscribers: cfe-commits, gamesh411, dkrupp, donat.nagy, jfb, mikhail.ramalho, a.sidorin, szepet, whisperity.
https://bugs.llvm.org/show_bug.cgi?id=41611 Similarly to D61106 <https://reviews.llvm.org/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 <https://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Vector-Extensions.html#Vector-Extensions>, > 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. vector types are safe to regard as primitive. Repository: rC Clang https://reviews.llvm.org/D61246 Files: lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h test/Analysis/cxx-uninitialized-object-ptr-ref.cpp test/Analysis/cxx-uninitialized-object.cpp Index: test/Analysis/cxx-uninitialized-object.cpp =================================================================== --- test/Analysis/cxx-uninitialized-object.cpp +++ test/Analysis/cxx-uninitialized-object.cpp @@ -1132,7 +1132,7 @@ } //===----------------------------------------------------------------------===// -// _Atomic tests. +// "Esoteric" primitive type tests. //===----------------------------------------------------------------------===// struct MyAtomicInt { @@ -1142,6 +1142,15 @@ 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() { + VectorSizeLong v; +} Index: test/Analysis/cxx-uninitialized-object-ptr-ref.cpp =================================================================== --- test/Analysis/cxx-uninitialized-object-ptr-ref.cpp +++ test/Analysis/cxx-uninitialized-object-ptr-ref.cpp @@ -256,6 +256,28 @@ 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; + VectorSizePointee v(&i); +} + struct CyclicPointerTest1 { int *ptr; // expected-note{{object references itself 'this->ptr'}} int dontGetFilteredByNonPedanticMode = 0; Index: lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h =================================================================== --- lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h +++ lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h @@ -324,7 +324,8 @@ 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) {
Index: test/Analysis/cxx-uninitialized-object.cpp =================================================================== --- test/Analysis/cxx-uninitialized-object.cpp +++ test/Analysis/cxx-uninitialized-object.cpp @@ -1132,7 +1132,7 @@ } //===----------------------------------------------------------------------===// -// _Atomic tests. +// "Esoteric" primitive type tests. //===----------------------------------------------------------------------===// struct MyAtomicInt { @@ -1142,6 +1142,15 @@ 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() { + VectorSizeLong v; +} Index: test/Analysis/cxx-uninitialized-object-ptr-ref.cpp =================================================================== --- test/Analysis/cxx-uninitialized-object-ptr-ref.cpp +++ test/Analysis/cxx-uninitialized-object-ptr-ref.cpp @@ -256,6 +256,28 @@ 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; + VectorSizePointee v(&i); +} + struct CyclicPointerTest1 { int *ptr; // expected-note{{object references itself 'this->ptr'}} int dontGetFilteredByNonPedanticMode = 0; Index: lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h =================================================================== --- lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h +++ lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h @@ -324,7 +324,8 @@ 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) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits