]> granicus.if.org Git - clang/commitdiff
Parse brace initializers as default arguments. PR12236.
authorSebastian Redl <sebastian.redl@getdesigned.at>
Wed, 14 Mar 2012 15:54:00 +0000 (15:54 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Wed, 14 Mar 2012 15:54:00 +0000 (15:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152721 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseCXXInlineMethods.cpp
lib/Parse/ParseDecl.cpp
test/SemaCXX/cxx0x-initializer-scalars.cpp

index 7ee74ecc7696384c395be61c722cd4fd035eead1..8a6e1ce33f3ff8c9b0e9953c4b3cb653dc7790b0 100644 (file)
@@ -319,7 +319,11 @@ void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) {
                                             Sema::PotentiallyEvaluatedIfUsed,
                                             LM.DefaultArgs[I].Param);
 
-      ExprResult DefArgResult(ParseAssignmentExpression());
+      ExprResult DefArgResult;
+      if (Tok.is(tok::l_brace))
+        DefArgResult = ParseBraceInitializer();
+      else
+        DefArgResult = ParseAssignmentExpression();
       if (DefArgResult.isInvalid())
         Actions.ActOnParamDefaultArgumentError(LM.DefaultArgs[I].Param);
       else {
index 31a898cf5a0f0fb1b3de9e249819c222c1c34590..3ff9da035fd961af40c5b178ec345f63c43764d1 100644 (file)
@@ -4169,6 +4169,7 @@ void Parser::ParseFunctionDeclaratorIdentifierList(
 ///       parameter-declaration: [C99 6.7.5]
 ///         declaration-specifiers declarator
 /// [C++]   declaration-specifiers declarator '=' assignment-expression
+/// [C++11]                                       initializer-clause
 /// [GNU]   declaration-specifiers declarator attributes
 ///         declaration-specifiers abstract-declarator[opt]
 /// [C++]   declaration-specifiers abstract-declarator[opt]
@@ -4280,7 +4281,11 @@ void Parser::ParseParameterDeclarationClause(
                                               Sema::PotentiallyEvaluatedIfUsed,
                                                 Param);
 
-          ExprResult DefArgResult(ParseAssignmentExpression());
+          ExprResult DefArgResult;
+          if (Tok.is(tok::l_brace))
+            DefArgResult = ParseBraceInitializer();
+          else
+            DefArgResult = ParseAssignmentExpression();
           if (DefArgResult.isInvalid()) {
             Actions.ActOnParamDefaultArgumentError(Param);
             SkipUntil(tok::comma, tok::r_paren, true, true);
index 91fbaad8b1e6672263975175f2d603c163c1aca7..627855e96e8cb61cb88c8102d1bbe1ab770f6b27 100644 (file)
@@ -96,6 +96,13 @@ namespace integral {
     (void) int({0}); // expected-error {{functional-style cast}}
     new int({0});  // expected-error {{cannot initialize}}
   }
+
+  void default_argument(int i = {}) {
+  }
+  struct DefaultArgument {
+    void default_argument(int i = {}) {
+    }
+  };
 }
 
 namespace PR12118 {