[cfe-commits] r73888 - in /cfe/trunk: include/clang/AST/DeclCXX.h lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclCXX.cpp lib/Sema/SemaExpr.cpp

Fariborz Jahanian fjahanian at apple.com
Mon Jun 22 10:30:34 PDT 2009


Author: fjahanian
Date: Mon Jun 22 12:30:33 2009
New Revision: 73888

URL: http://llvm.org/viewvc/llvm-project?rev=73888&view=rev
Log:
Remove ImplicitMustBeDefined, use universal 'Used' flag
instead. Do the implicit default ctor checking in MarkDeclarationReferenced.

Modified:
    cfe/trunk/include/clang/AST/DeclCXX.h
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/lib/Sema/SemaExpr.cpp

Modified: cfe/trunk/include/clang/AST/DeclCXX.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=73888&r1=73887&r2=73888&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/DeclCXX.h (original)
+++ cfe/trunk/include/clang/AST/DeclCXX.h Mon Jun 22 12:30:33 2009
@@ -642,18 +642,13 @@
   /// @c !Implicit && ImplicitlyDefined.
   bool ImplicitlyDefined : 1;
   
-  /// ImplicitMustBeDefined - Implicit constructor was used to create an 
-  /// object of its class type. It must be defined.
-  bool ImplicitMustBeDefined : 1;
-
   /// FIXME: Add support for base and member initializers.
 
   CXXConstructorDecl(CXXRecordDecl *RD, SourceLocation L,
                      DeclarationName N, QualType T,
                      bool isExplicit, bool isInline, bool isImplicitlyDeclared)
     : CXXMethodDecl(CXXConstructor, RD, L, N, T, false, isInline),
-      Explicit(isExplicit), ImplicitlyDefined(false),  
-      ImplicitMustBeDefined(false) { 
+      Explicit(isExplicit), ImplicitlyDefined(false) { 
     setImplicit(isImplicitlyDeclared);
   }
 
@@ -683,17 +678,6 @@
            "Can only set the implicit-definition flag once the constructor has been defined");
     ImplicitlyDefined = ID; 
   }
-
-  /// isImplicitMustBeDefined - Whether a definition must be synthesized for
-  /// the implicit constructor.
-  bool isImplicitMustBeDefined() const {
-    return isImplicit() && ImplicitMustBeDefined;
-  }
-  
-  /// setImplicitMustBeDefined - constructor must be implicitly defined.
-  void setImplicitMustBeDefined() {
-    ImplicitMustBeDefined = true;
-  }
   
   /// isDefaultConstructor - Whether this constructor is a default
   /// constructor (C++ [class.ctor]p5), which can be used to

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=73888&r1=73887&r2=73888&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Jun 22 12:30:33 2009
@@ -2733,12 +2733,9 @@
                                                  IK_Default);
         if (!Constructor)
           Var->setInvalidDecl();
-        else  { 
+        else 
           if (!RD->hasTrivialConstructor())
             InitializeVarWithConstructor(Var, Constructor, InitType, 0, 0);
-            // Check for valid construction.
-            DefineImplicitDefaultConstructor(Var->getLocation(), Constructor);
-        }
       }
     }
 

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=73888&r1=73887&r2=73888&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Jun 22 12:30:33 2009
@@ -1843,7 +1843,7 @@
 void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
                                             CXXConstructorDecl *Constructor) {
   if (!Constructor->isDefaultConstructor() ||
-      !Constructor->isImplicit() || Constructor->isImplicitMustBeDefined())
+      !Constructor->isImplicit() || Constructor->isUsed())
     return;
   
   CXXRecordDecl *ClassDecl
@@ -1862,7 +1862,7 @@
       if (CXXConstructorDecl *BaseCtor = 
             BaseClassDecl->getDefaultConstructor(Context)) {
         if (BaseCtor->isImplicit())
-          BaseCtor->setImplicitMustBeDefined();
+          BaseCtor->setUsed();
       }
       else {
         Diag(CurrentLocation, diag::err_defining_default_ctor) 
@@ -1887,7 +1887,7 @@
         if (CXXConstructorDecl *FieldCtor = 
             FieldClassDecl->getDefaultConstructor(Context)) {
           if (FieldCtor->isImplicit())
-            FieldCtor->setImplicitMustBeDefined();
+            FieldCtor->setUsed();
         }
         else {
           Diag(CurrentLocation, diag::err_defining_default_ctor) 
@@ -1912,7 +1912,7 @@
     }
   }
   if (!err)
-    Constructor->setImplicitMustBeDefined();  
+    Constructor->setUsed();  
 }
 
 void Sema::InitializeVarWithConstructor(VarDecl *VD, 
@@ -1990,9 +1990,6 @@
       VDecl->setCXXDirectInitializer(true);
       InitializeVarWithConstructor(VDecl, Constructor, DeclInitType, 
                                    (Expr**)Exprs.release(), NumExprs);
-      // An implicitly-declared default constructor for a class is implicitly
-      // defined when it is used to creat an object of its class type.
-      DefineImplicitDefaultConstructor(VDecl->getLocation(), Constructor);
     }
     return;
   }

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=73888&r1=73887&r2=73888&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Jun 22 12:30:33 2009
@@ -5461,6 +5461,13 @@
     return;
   
   // Note that this declaration has been used.
+  if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
+    DefineImplicitDefaultConstructor(Loc, Constructor);
+    // FIXME: set the Used flag if it is determined that ctor is valid.
+    Constructor->setUsed(true);
+    return;
+  } 
+  
   if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
     // FIXME: implicit template instantiation
     // FIXME: keep track of references to static functions





More information about the cfe-commits mailing list