<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>