[cfe-commits] r130483 - /cfe/trunk/lib/AST/Type.cpp

Chandler Carruth chandlerc at gmail.com
Fri Apr 29 00:47:42 PDT 2011


Author: chandlerc
Date: Fri Apr 29 02:47:42 2011
New Revision: 130483

URL: http://llvm.org/viewvc/llvm-project?rev=130483&view=rev
Log:
Don't assume that the AST methods will only be invoked on C++ types.
Teaches isLiteralType and isTrivialType to behave plausibly and most
importantly not crash on normal RecordDecls.

Sadly I have no real way to test this. I stumbled onto it by
mis-implementing a warning.

Modified:
    cfe/trunk/lib/AST/Type.cpp

Modified: cfe/trunk/lib/AST/Type.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=130483&r1=130482&r2=130483&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Type.cpp (original)
+++ cfe/trunk/lib/AST/Type.cpp Fri Apr 29 02:47:42 2011
@@ -891,22 +891,24 @@
   if (BaseTy->isReferenceType()) return true;
   //    -- a class type that has all of the following properties:
   if (const RecordType *RT = BaseTy->getAs<RecordType>()) {
-    const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(RT->getDecl());
-    //      -- a trivial destructor,
-    if (!ClassDecl->hasTrivialDestructor()) return false;
-    //      -- every constructor call and full-expression in the
-    //         brace-or-equal-initializers for non-static data members (if any)
-    //         is a constant expression,
-    // FIXME: C++0x: Clang doesn't yet support non-static data member
-    // declarations with initializers, or constexprs.
-    //      -- it is an aggregate type or has at least one constexpr
-    //         constructor or constructor template that is not a copy or move
-    //         constructor, and
-    if (!ClassDecl->isAggregate() &&
-        !ClassDecl->hasConstExprNonCopyMoveConstructor())
-      return false;
-    //      -- all non-static data members and base classes of literal types
-    if (ClassDecl->hasNonLiteralTypeFieldsOrBases()) return false;
+    if (const CXXRecordDecl *ClassDecl =
+        dyn_cast<CXXRecordDecl>(RT->getDecl())) {
+      //    -- a trivial destructor,
+      if (!ClassDecl->hasTrivialDestructor()) return false;
+      //    -- every constructor call and full-expression in the
+      //       brace-or-equal-initializers for non-static data members (if any)
+      //       is a constant expression,
+      // FIXME: C++0x: Clang doesn't yet support non-static data member
+      // declarations with initializers, or constexprs.
+      //    -- it is an aggregate type or has at least one constexpr
+      //       constructor or constructor template that is not a copy or move
+      //       constructor, and
+      if (!ClassDecl->isAggregate() &&
+          !ClassDecl->hasConstExprNonCopyMoveConstructor())
+        return false;
+      //    -- all non-static data members and base classes of literal types
+      if (ClassDecl->hasNonLiteralTypeFieldsOrBases()) return false;
+    }
 
     return true;
   }
@@ -925,13 +927,14 @@
   assert(BaseTy && "NULL element type");
   if (BaseTy->isScalarType()) return true;
   if (const RecordType *RT = BaseTy->getAs<RecordType>()) {
-    const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(RT->getDecl());
-
-    // C++0x [class]p5:
-    //   A trivial class is a class that has a trivial default constructor
-    if (!ClassDecl->hasTrivialConstructor()) return false;
-    //   and is trivially copyable.
-    if (!ClassDecl->isTriviallyCopyable()) return false;
+    if (const CXXRecordDecl *ClassDecl =
+        dyn_cast<CXXRecordDecl>(RT->getDecl())) {
+      // C++0x [class]p5:
+      //   A trivial class is a class that has a trivial default constructor
+      if (!ClassDecl->hasTrivialConstructor()) return false;
+      //   and is trivially copyable.
+      if (!ClassDecl->isTriviallyCopyable()) return false;
+    }
 
     return true;
   }





More information about the cfe-commits mailing list