[cfe-commits] r104733 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclCXX.cpp test/SemaCXX/flexible-array-test.cpp
Douglas Gregor
dgregor at apple.com
Wed May 26 13:28:03 PDT 2010
On May 26, 2010, at 1:19 PM, Fariborz Jahanian wrote:
> Author: fjahanian
> Date: Wed May 26 15:19:07 2010
> New Revision: 104733
>
> URL: http://llvm.org/viewvc/llvm-project?rev=104733&view=rev
> Log:
> Fixes misc. flexible array bugs in c++ (PR7029).
Excellent, thanks!
> Added:
> cfe/trunk/test/SemaCXX/flexible-array-test.cpp
> Modified:
> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=104733&r1=104732&r2=104733&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed May 26 15:19:07 2010
> @@ -1828,6 +1828,8 @@
>
> def err_flexible_array_empty_struct : Error<
> "flexible array %0 not allowed in otherwise empty struct">;
> +def err_flexible_array_has_nonpod_type : Error<
> + "flexible array %0 must have a non-dependent, non-POD type">;
How about: "flexible array %0 must have a non-POD element type" ?
> def ext_flexible_array_in_struct : Extension<
> "%0 may not be nested in a struct due to flexible array member">;
> def ext_flexible_array_in_array : Extension<
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=104733&r1=104732&r2=104733&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed May 26 15:19:07 2010
> @@ -6136,6 +6136,15 @@
> EnclosingDecl->setInvalidDecl();
> continue;
> }
> + if (!FD->getType()->isDependentType() &&
> + !Context.getBaseElementType(FD->getType())->isPODType()) {
> + Diag(FD->getLocation(), diag::err_flexible_array_has_nonpod_type)
> + << FD->getDeclName();
> + FD->setInvalidDecl();
> + EnclosingDecl->setInvalidDecl();
> + continue;
> + }
> +
> // Okay, we have a legal flexible array member at the end of the struct.
> if (Record)
> Record->setHasFlexibleArrayMember(true);
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=104733&r1=104732&r2=104733&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed May 26 15:19:07 2010
> @@ -1892,9 +1892,15 @@
>
> // Fields.
> for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
> - E = ClassDecl->field_end(); Field != E; ++Field)
> + E = ClassDecl->field_end(); Field != E; ++Field) {
> + if ((*Field)->getType()->isIncompleteArrayType()) {
> + assert(ClassDecl->hasFlexibleArrayMember() &&
> + "Incomplete array type is not valid");
> + continue;
> + }
> if (CollectFieldInitializer(Info, *Field, *Field))
> HadError = true;
> + }
>
> NumInitializers = Info.AllToInit.size();
> if (NumInitializers > 0) {
> @@ -4577,6 +4583,11 @@
> }
>
> QualType FieldType = Field->getType().getNonReferenceType();
> + if (FieldType->isIncompleteArrayType()) {
> + assert(ClassDecl->hasFlexibleArrayMember() &&
> + "Incomplete array type is not valid");
> + continue;
> + }
>
> // Build references to the field in the object we're copying from and to.
> CXXScopeSpec SS; // Intentionally empty
>
> Added: cfe/trunk/test/SemaCXX/flexible-array-test.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/flexible-array-test.cpp?rev=104733&view=auto
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/flexible-array-test.cpp (added)
> +++ cfe/trunk/test/SemaCXX/flexible-array-test.cpp Wed May 26 15:19:07 2010
> @@ -0,0 +1,45 @@
> +// RUN: %clang_cc1 -fsyntax-only -verify %s
> +// pr7029
> +
> +template <class Key, class T> struct QMap
> +{
> + void insert(const Key &, const T &);
> + T v;
> +};
> +
> +
> +template <class Key, class T>
> +void QMap<Key, T>::insert(const Key &, const T &avalue)
> +{
> + v = avalue;
> +}
> +
> +
> +struct inotify_event
> +{
> + int wd;
> +
> + // clang doesn't like '[]':
> + // cannot initialize a parameter of type 'void *' with an rvalue of type 'char (*)[]'
> + char name [];
> +};
> +
> +
> +void foo()
> +{
> + inotify_event event;
> + inotify_event* ptr = &event;
> + inotify_event event1 = *ptr;
> + *ptr = event;
> + QMap<int, inotify_event> eventForId;
> + eventForId.insert(ptr->wd, *ptr);
> +}
> +
> +struct S {
> + virtual void foo();
> +};
> +
> +struct X {
> + int blah;
> + S strings[]; // expected-error {{flexible array 'strings' must have a non-dependent, non-POD type}}
> +};
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list