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

Reply via email to