<div dir="ltr">LGTM</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jul 21, 2014 at 11:28 AM, Serge Pavlov <span dir="ltr"><<a href="mailto:sepavloff@gmail.com" target="_blank">sepavloff@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Changed treatment of erroneous default value.<br>
<br>
Indeed, using OpaqueValueExpr make code more readable. Thank you!<br>
<br>
<a href="http://reviews.llvm.org/D4378" target="_blank">http://reviews.llvm.org/D4378</a><br>
<br>
Files:<br>
  include/clang/Sema/Sema.h<br>
  lib/Parse/ParseCXXInlineMethods.cpp<br>
  lib/Parse/ParseDecl.cpp<br>
  lib/Sema/SemaDeclCXX.cpp<br>
  test/SemaCXX/default1.cpp<br>
<br>
Index: include/clang/Sema/Sema.h<br>
===================================================================<br>
--- include/clang/Sema/Sema.h<br>
+++ include/clang/Sema/Sema.h<br>
@@ -1621,7 +1621,7 @@<br>
   void ActOnParamUnparsedDefaultArgument(Decl *param,<br>
                                          SourceLocation EqualLoc,<br>
                                          SourceLocation ArgLoc);<br>
-  void ActOnParamDefaultArgumentError(Decl *param);<br>
+  void ActOnParamDefaultArgumentError(Decl *param, SourceLocation EqualLoc);<br>
   bool SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,<br>
                                SourceLocation EqualLoc);<br>
<br>
Index: lib/Parse/ParseCXXInlineMethods.cpp<br>
===================================================================<br>
--- lib/Parse/ParseCXXInlineMethods.cpp<br>
+++ lib/Parse/ParseCXXInlineMethods.cpp<br>
@@ -337,7 +337,8 @@<br>
       } else<br>
         DefArgResult = ParseAssignmentExpression();<br>
       if (DefArgResult.isInvalid())<br>
-        Actions.ActOnParamDefaultArgumentError(LM.DefaultArgs[I].Param);<br>
+        Actions.ActOnParamDefaultArgumentError(LM.DefaultArgs[I].Param,<br>
+                                               EqualLoc);<br>
       else {<br>
         if (!TryConsumeToken(tok::cxx_defaultarg_end)) {<br>
           // The last two tokens are the terminator and the saved value of<br>
Index: lib/Parse/ParseDecl.cpp<br>
===================================================================<br>
--- lib/Parse/ParseDecl.cpp<br>
+++ lib/Parse/ParseDecl.cpp<br>
@@ -5436,7 +5436,7 @@<br>
           if (!ConsumeAndStoreInitializer(*DefArgToks, CIK_DefaultArgument)) {<br>
             delete DefArgToks;<br>
             DefArgToks = nullptr;<br>
-            Actions.ActOnParamDefaultArgumentError(Param);<br>
+            Actions.ActOnParamDefaultArgumentError(Param, EqualLoc);<br>
           } else {<br>
             // Mark the end of the default argument so that we know when to<br>
             // stop when we parse it later on.<br>
@@ -5465,7 +5465,7 @@<br>
           } else<br>
             DefArgResult = ParseAssignmentExpression();<br>
           if (DefArgResult.isInvalid()) {<br>
-            Actions.ActOnParamDefaultArgumentError(Param);<br>
+            Actions.ActOnParamDefaultArgumentError(Param, EqualLoc);<br>
             SkipUntil(tok::comma, tok::r_paren, StopAtSemi | StopBeforeMatch);<br>
           } else {<br>
             // Inform the actions module about the default argument<br>
Index: lib/Sema/SemaDeclCXX.cpp<br>
===================================================================<br>
--- lib/Sema/SemaDeclCXX.cpp<br>
+++ lib/Sema/SemaDeclCXX.cpp<br>
@@ -344,13 +344,16 @@<br>
<br>
 /// ActOnParamDefaultArgumentError - Parsing or semantic analysis of<br>
 /// the default argument for the parameter param failed.<br>
-void Sema::ActOnParamDefaultArgumentError(Decl *param) {<br>
+void Sema::ActOnParamDefaultArgumentError(Decl *param,<br>
+                                          SourceLocation EqualLoc) {<br>
   if (!param)<br>
     return;<br>
<br>
   ParmVarDecl *Param = cast<ParmVarDecl>(param);<br>
   Param->setInvalidDecl();<br>
   UnparsedDefaultArgLocs.erase(Param);<br>
+  Param->setDefaultArg(new(Context)<br>
+                       OpaqueValueExpr(EqualLoc, Param->getType(), VK_RValue));<br>
 }<br>
<br>
 /// CheckExtraCXXDefaultArguments - Check for any extra default<br>
<div class="">Index: test/SemaCXX/default1.cpp<br>
===================================================================<br>
--- test/SemaCXX/default1.cpp<br>
+++ test/SemaCXX/default1.cpp<br>
</div>@@ -62,3 +62,6 @@<br>
<div class="">     j(2, 3); // expected-error{{too many arguments to function call, expected at most single argument 'f', have 2}}<br>
   }<br>
 }<br>
+<br>
+int pr20055_f(int x = 0, int y = UNDEFINED); // expected-error{{use of undeclared identifier}}<br>
</div>+int pr20055_v = pr20055_f(0);<br>
<br>_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br></blockquote></div><br></div>