puneetha updated this revision to Diff 102516. puneetha added a comment. Incorrectly rejecting __is_destructible queries on arrays of unknown bound of incomplete types.
https://reviews.llvm.org/D34198 Files: lib/Sema/SemaExprCXX.cpp Index: lib/Sema/SemaExprCXX.cpp =================================================================== --- lib/Sema/SemaExprCXX.cpp +++ lib/Sema/SemaExprCXX.cpp @@ -4101,6 +4101,11 @@ case UTT_IsDestructible: case UTT_IsNothrowDestructible: case UTT_IsTriviallyDestructible: + if (ArgTy->isIncompleteArrayType() || ArgTy->isVoidType()) + return true; + + return !S.RequireCompleteType( + Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr); // Per the GCC type traits documentation, the same constraints apply to these. case UTT_HasNothrowAssign: case UTT_HasNothrowMoveAssign: @@ -4113,9 +4118,15 @@ case UTT_HasTrivialCopy: case UTT_HasTrivialDestructor: case UTT_HasVirtualDestructor: - if (ArgTy->isIncompleteArrayType() || ArgTy->isVoidType()) + if(ArgTy->isVoidType()) return true; + if (ArgTy->isIncompleteArrayType()) { + QualType ElTy = QualType(ArgTy->getBaseElementTypeUnsafe(), 0); + if (!ElTy->isIncompleteType()) + return true; + } + return !S.RequireCompleteType( Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr); }
Index: lib/Sema/SemaExprCXX.cpp =================================================================== --- lib/Sema/SemaExprCXX.cpp +++ lib/Sema/SemaExprCXX.cpp @@ -4101,6 +4101,11 @@ case UTT_IsDestructible: case UTT_IsNothrowDestructible: case UTT_IsTriviallyDestructible: + if (ArgTy->isIncompleteArrayType() || ArgTy->isVoidType()) + return true; + + return !S.RequireCompleteType( + Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr); // Per the GCC type traits documentation, the same constraints apply to these. case UTT_HasNothrowAssign: case UTT_HasNothrowMoveAssign: @@ -4113,9 +4118,15 @@ case UTT_HasTrivialCopy: case UTT_HasTrivialDestructor: case UTT_HasVirtualDestructor: - if (ArgTy->isIncompleteArrayType() || ArgTy->isVoidType()) + if(ArgTy->isVoidType()) return true; + if (ArgTy->isIncompleteArrayType()) { + QualType ElTy = QualType(ArgTy->getBaseElementTypeUnsafe(), 0); + if (!ElTy->isIncompleteType()) + return true; + } + return !S.RequireCompleteType( Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits