Implement some framework for defaulted constructors.

There's some unused stuff for now.

llvm-svn: 130912
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index a20e90b..1eaae67 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -966,6 +966,11 @@
         Diag(DelLoc, diag::warn_deleted_function_accepted_as_extension);
 
       Actions.SetDeclDeleted(ThisDecl, DelLoc);
+    } else if (Tok.is(tok::kw_default)) {
+      SourceLocation DefLoc = ConsumeToken();
+      Diag(DefLoc, diag::err_default_special_members);
+
+      ThisDecl->setInvalidDecl();
     } else {
       if (getLang().CPlusPlus && D.getCXXScopeSpec().isSet()) {
         EnterScope(0);
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 596778d..41b773e 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -1621,6 +1621,8 @@
   ExprResult BitfieldSize;
   ExprResult Init;
   bool Deleted = false;
+  bool Defaulted = false;
+  SourceLocation DefLoc;
 
   while (1) {
     // member-declarator:
@@ -1652,6 +1654,11 @@
           Diag(Tok, diag::warn_deleted_function_accepted_as_extension);
         ConsumeToken();
         Deleted = true;
+      } else if (Tok.is(tok::kw_delete)) {
+        if (!getLang().CPlusPlus0x)
+          Diag(Tok, diag::warn_defaulted_function_accepted_as_extension);
+        DefLoc = ConsumeToken();
+        Defaulted = true;
       } else {
         Init = ParseInitializer();
         if (Init.isInvalid())
@@ -1683,6 +1690,10 @@
       ThisDecl = Actions.ActOnFriendFunctionDecl(getCurScope(), DeclaratorInfo,
                                                  /*IsDefinition*/ false,
                                                  move(TemplateParams));
+      if (Defaulted) {
+        Diag(DefLoc, diag::err_friends_define_only_namespace_scope);
+        ThisDecl->setInvalidDecl();
+      }
     } else {
       ThisDecl = Actions.ActOnCXXMemberDeclarator(getCurScope(), AS,
                                                   DeclaratorInfo,
@@ -1690,7 +1701,7 @@
                                                   BitfieldSize.release(),
                                                   VS, Init.release(),
                                                   /*IsDefinition*/Deleted,
-                                                  Deleted);
+                                                  Deleted, Defaulted);
     }
     if (ThisDecl)
       DeclsInGroup.push_back(ThisDecl);
@@ -1717,6 +1728,7 @@
     BitfieldSize = 0;
     Init = 0;
     Deleted = false;
+    Defaulted = false;
 
     // Attributes are only allowed on the second declarator.
     MaybeParseGNUAttributes(DeclaratorInfo);