Index: test/Parser/cxx-altivec.cpp
===================================================================
--- test/Parser/cxx-altivec.cpp	(revision 117673)
+++ test/Parser/cxx-altivec.cpp	(working copy)
@@ -169,7 +169,7 @@
 public:
   VectorClassNonPod() {}
   virtual ~VectorClassNonPod() {}
-} __attribute__((vecreturn));     // expected-error {{the vecreturn attribute can only be used on a POD (plain old data) class or structure (i.e. no virtual functions)}}
+} __attribute__((vecreturn));     // expected-error {{the vecreturn attribute can only be used on a class or structure with no virtual functions}}
 
 // vecreturn attribute test - should error because of virtual function.
 class VectorClassMultipleMembers
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td	(revision 117673)
+++ include/clang/Basic/DiagnosticSemaKinds.td	(working copy)
@@ -995,8 +995,8 @@
   " attribute ignored">;
 def err_attribute_vecreturn_only_vector_member : Error<
   "the vecreturn attribute can only be used on a class or structure with one member, which must be a vector">;
-def err_attribute_vecreturn_only_pod_record : Error<
-  "the vecreturn attribute can only be used on a POD (plain old data) class or structure (i.e. no virtual functions)">;
+def err_attribute_vecreturn_only_nonvirtual_record : Error<
+  "the vecreturn attribute can only be used on a class or structure with no virtual functions">;
 def err_cconv_change : Error<
   "function declared '%0' here was previously declared "
   "%select{'%2'|without calling convention}1">;
Index: lib/Sema/SemaDeclAttr.cpp
===================================================================
--- lib/Sema/SemaDeclAttr.cpp	(revision 117673)
+++ lib/Sema/SemaDeclAttr.cpp	(working copy)
@@ -772,16 +772,13 @@
   RecordDecl *record = cast<RecordDecl>(d);
   int count = 0;
 
-  if (!isa<CXXRecordDecl>(record)) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_vecreturn_only_vector_member);
-    return;
+  if (isa<CXXRecordDecl>(record)) {
+    if (cast<CXXRecordDecl>(record)->isDynamicClass()) {
+		S.Diag(Attr.getLoc(), diag::err_attribute_vecreturn_only_nonvirtual_record);
+		return;
+    }
   }
 
-  if (!cast<CXXRecordDecl>(record)->isPOD()) {
-    S.Diag(Attr.getLoc(), diag::err_attribute_vecreturn_only_pod_record);
-    return;
-  }
-
   for (RecordDecl::field_iterator iter = record->field_begin(); iter != record->field_end(); iter++) {
     if ((count == 1) || !iter->getType()->isVectorType()) {
       S.Diag(Attr.getLoc(), diag::err_attribute_vecreturn_only_vector_member);
