]> granicus.if.org Git - clang/commitdiff
Parse: Don't crash when default argument in typedef consists of sole '='
authorDavid Majnemer <david.majnemer@gmail.com>
Tue, 13 Jan 2015 07:42:33 +0000 (07:42 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Tue, 13 Jan 2015 07:42:33 +0000 (07:42 +0000)
We'd crash trying to make the SourceRange for the tokens we'd like to
highlight.  Don't assume there is more than one token makes up the
default argument.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225774 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/Parser/cxx-default-args.cpp

index b84ea7b04f56b6a4a1a2fad3d76e7b1b7237f5ae..510738ea8168b53afe8cda18616ac394af4efe42 100644 (file)
@@ -388,9 +388,14 @@ void Sema::CheckExtraCXXDefaultArguments(Declarator &D) {
         ParmVarDecl *Param = cast<ParmVarDecl>(chunk.Fun.Params[argIdx].Param);
         if (Param->hasUnparsedDefaultArg()) {
           CachedTokens *Toks = chunk.Fun.Params[argIdx].DefaultArgTokens;
+          SourceRange SR;
+          if (Toks->size() > 1)
+            SR = SourceRange((*Toks)[1].getLocation(),
+                             Toks->back().getLocation());
+          else
+            SR = UnparsedDefaultArgLocs[Param];
           Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
-            << SourceRange((*Toks)[1].getLocation(),
-                           Toks->back().getLocation());
+            << SR;
           delete Toks;
           chunk.Fun.Params[argIdx].DefaultArgTokens = nullptr;
         } else if (Param->getDefaultArg()) {
index 0c028f7366f78a5fdf87af877c902166ddd94295..0095a2f04dc417f121d8b9db147b03df41e1f9bb 100644 (file)
@@ -39,4 +39,5 @@ struct S {
 
 struct U {
   void i(int x = ) {} // expected-error{{expected expression}}
+  typedef int *fp(int x = ); // expected-error{{default arguments can only be specified for parameters in a function declaration}}
 };