]> granicus.if.org Git - clang/commitdiff
Remove ImplicitMustBeDefined, use universal 'Used' flag
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 22 Jun 2009 17:30:33 +0000 (17:30 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 22 Jun 2009 17:30:33 +0000 (17:30 +0000)
instead. Do the implicit default ctor checking in MarkDeclarationReferenced.

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

include/clang/AST/DeclCXX.h
lib/Sema/SemaDecl.cpp
lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaExpr.cpp

index 9ca1823f38229d978d75e64597cdbd9c3db6c106..2db0ca2274d0178db908505301840d09fffabbb7 100644 (file)
@@ -642,18 +642,13 @@ class CXXConstructorDecl : public CXXMethodDecl {
   /// @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 @@ public:
            "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
index 06fd1a17362aa96c45077197a85c16a0590cce72..eba1d58d6024c876311adbc5e8b0f217466b006a 100644 (file)
@@ -2733,12 +2733,9 @@ void Sema::ActOnUninitializedDecl(DeclPtrTy dcl) {
                                                  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);
-        }
       }
     }
 
index 6d740eb5b7ec87eb1ad8aec9b4c85e3a41942b60..6e1745009387058bd42f0905e3b114f04aeccf5c 100644 (file)
@@ -1843,7 +1843,7 @@ Sema::DeclPtrTy Sema::ActOnNamespaceAliasDef(Scope *S,
 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 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
       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 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
         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 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
     }
   }
   if (!err)
-    Constructor->setImplicitMustBeDefined();  
+    Constructor->setUsed();  
 }
 
 void Sema::InitializeVarWithConstructor(VarDecl *VD, 
@@ -1990,9 +1990,6 @@ void Sema::AddCXXDirectInitializerToDecl(DeclPtrTy Dcl,
       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;
   }
index 692502bbbe81c0daa4388d086c04533d7def79f0..e989b1f282fda055c7ad544de3e6f7ed03addd02 100644 (file)
@@ -5461,6 +5461,13 @@ void Sema::MarkDeclarationReferenced(SourceLocation Loc, Decl *D) {
     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