]> granicus.if.org Git - clang/commitdiff
When deleting a value of class type, make sure that type is complete
authorDouglas Gregor <dgregor@apple.com>
Thu, 29 Jul 2010 14:44:35 +0000 (14:44 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 29 Jul 2010 14:44:35 +0000 (14:44 +0000)
before looking for conversions to pointer type. Fixes <rdar://problem/8248780>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109749 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExprCXX.cpp
test/SemaCXX/new-delete.cpp

index 891fba2c29e84e48570a4c5d1af1938697c4730b..99d8eefe2d2baeadb843b9f2db69ddada4b1c96e 100644 (file)
@@ -2387,6 +2387,8 @@ def err_ambiguous_delete_operand : Error<"ambiguous conversion of delete "
                                          "expression of type %0 to a pointer">;
 def warn_delete_incomplete : Warning<
   "deleting pointer to incomplete type %0 may cause undefined behaviour">;
+def err_delete_incomplete_class_type : Warning<
+  "deleting incomplete class type %0; no conversions to pointer type">;
 def err_no_suitable_delete_member_function_found : Error<
   "no suitable member %0 in %1">;
 def note_member_declared_here : Note<
index 0fe46ed607b30092f2edca7fbba15fec59496b90..d9f7c13f3debfb1eb05f2e6b1e4643264e64440f 100644 (file)
@@ -1360,6 +1360,10 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
     QualType Type = Ex->getType();
 
     if (const RecordType *Record = Type->getAs<RecordType>()) {
+      if (RequireCompleteType(StartLoc, Type, 
+                              PDiag(diag::err_delete_incomplete_class_type)))
+        return ExprError();
+      
       llvm::SmallVector<CXXConversionDecl*, 4> ObjectPtrConversions;
 
       CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
index 25bf823b255517410dd5592f513dda5ca68f477e..e8176a7758a213968b01af339e08ce992a45e00e 100644 (file)
@@ -310,3 +310,14 @@ namespace rdar8018245 {
   template int *f<X1>(); // expected-note{{in instantiation of}}
 
 }
+
+// <rdar://problem/8248780>
+namespace Instantiate {
+  template<typename T> struct X { 
+    operator T*();
+  };
+
+  void f(X<int> &xi) {
+    delete xi;
+  }
+}