[PATCH] Avoid crash if default argument parsed with errors.

Richard Smith richard at metafoo.co.uk
Mon Jul 21 13:13:02 PDT 2014


LGTM


On Mon, Jul 21, 2014 at 11:28 AM, Serge Pavlov <sepavloff at gmail.com> wrote:

> Changed treatment of erroneous default value.
>
> Indeed, using OpaqueValueExpr make code more readable. Thank you!
>
> http://reviews.llvm.org/D4378
>
> Files:
>   include/clang/Sema/Sema.h
>   lib/Parse/ParseCXXInlineMethods.cpp
>   lib/Parse/ParseDecl.cpp
>   lib/Sema/SemaDeclCXX.cpp
>   test/SemaCXX/default1.cpp
>
> Index: include/clang/Sema/Sema.h
> ===================================================================
> --- include/clang/Sema/Sema.h
> +++ include/clang/Sema/Sema.h
> @@ -1621,7 +1621,7 @@
>    void ActOnParamUnparsedDefaultArgument(Decl *param,
>                                           SourceLocation EqualLoc,
>                                           SourceLocation ArgLoc);
> -  void ActOnParamDefaultArgumentError(Decl *param);
> +  void ActOnParamDefaultArgumentError(Decl *param, SourceLocation
> EqualLoc);
>    bool SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg,
>                                 SourceLocation EqualLoc);
>
> Index: lib/Parse/ParseCXXInlineMethods.cpp
> ===================================================================
> --- lib/Parse/ParseCXXInlineMethods.cpp
> +++ lib/Parse/ParseCXXInlineMethods.cpp
> @@ -337,7 +337,8 @@
>        } else
>          DefArgResult = ParseAssignmentExpression();
>        if (DefArgResult.isInvalid())
> -        Actions.ActOnParamDefaultArgumentError(LM.DefaultArgs[I].Param);
> +        Actions.ActOnParamDefaultArgumentError(LM.DefaultArgs[I].Param,
> +                                               EqualLoc);
>        else {
>          if (!TryConsumeToken(tok::cxx_defaultarg_end)) {
>            // The last two tokens are the terminator and the saved value of
> Index: lib/Parse/ParseDecl.cpp
> ===================================================================
> --- lib/Parse/ParseDecl.cpp
> +++ lib/Parse/ParseDecl.cpp
> @@ -5436,7 +5436,7 @@
>            if (!ConsumeAndStoreInitializer(*DefArgToks,
> CIK_DefaultArgument)) {
>              delete DefArgToks;
>              DefArgToks = nullptr;
> -            Actions.ActOnParamDefaultArgumentError(Param);
> +            Actions.ActOnParamDefaultArgumentError(Param, EqualLoc);
>            } else {
>              // Mark the end of the default argument so that we know when
> to
>              // stop when we parse it later on.
> @@ -5465,7 +5465,7 @@
>            } else
>              DefArgResult = ParseAssignmentExpression();
>            if (DefArgResult.isInvalid()) {
> -            Actions.ActOnParamDefaultArgumentError(Param);
> +            Actions.ActOnParamDefaultArgumentError(Param, EqualLoc);
>              SkipUntil(tok::comma, tok::r_paren, StopAtSemi |
> StopBeforeMatch);
>            } else {
>              // Inform the actions module about the default argument
> Index: lib/Sema/SemaDeclCXX.cpp
> ===================================================================
> --- lib/Sema/SemaDeclCXX.cpp
> +++ lib/Sema/SemaDeclCXX.cpp
> @@ -344,13 +344,16 @@
>
>  /// ActOnParamDefaultArgumentError - Parsing or semantic analysis of
>  /// the default argument for the parameter param failed.
> -void Sema::ActOnParamDefaultArgumentError(Decl *param) {
> +void Sema::ActOnParamDefaultArgumentError(Decl *param,
> +                                          SourceLocation EqualLoc) {
>    if (!param)
>      return;
>
>    ParmVarDecl *Param = cast<ParmVarDecl>(param);
>    Param->setInvalidDecl();
>    UnparsedDefaultArgLocs.erase(Param);
> +  Param->setDefaultArg(new(Context)
> +                       OpaqueValueExpr(EqualLoc, Param->getType(),
> VK_RValue));
>  }
>
>  /// CheckExtraCXXDefaultArguments - Check for any extra default
> Index: test/SemaCXX/default1.cpp
> ===================================================================
> --- test/SemaCXX/default1.cpp
> +++ test/SemaCXX/default1.cpp
> @@ -62,3 +62,6 @@
>      j(2, 3); // expected-error{{too many arguments to function call,
> expected at most single argument 'f', have 2}}
>    }
>  }
> +
> +int pr20055_f(int x = 0, int y = UNDEFINED); // expected-error{{use of
> undeclared identifier}}
> +int pr20055_v = pr20055_f(0);
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140721/7d55191a/attachment.html>


More information about the cfe-commits mailing list