summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2012-11-07 19:08:05 +0000
committerDavid Blaikie <dblaikie@gmail.com>2012-11-07 19:08:05 +0000
commit0da2fa35613e26474e760be3c62f79c382e4726c (patch)
treee70b1662ed67801b10afc3cadaf32554d32f236a
parent40f2d30987d2996d682c5972955767b1415ec637 (diff)
downloadbcm5719-llvm-0da2fa35613e26474e760be3c62f79c382e4726c.tar.gz
bcm5719-llvm-0da2fa35613e26474e760be3c62f79c382e4726c.zip
PR12713 - crash on invalid due to unmatched parens in decltype
llvm-svn: 167547
-rw-r--r--clang/lib/Parse/Parser.cpp4
-rw-r--r--clang/test/SemaCXX/decltype.cpp7
2 files changed, 9 insertions, 2 deletions
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 7bf42201999..f4cdd619cef 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -1940,8 +1940,8 @@ bool BalancedDelimiterTracker::diagnoseMissingClose() {
}
P.Diag(P.Tok, DID);
P.Diag(LOpen, diag::note_matching) << LHSName;
- if (P.SkipUntil(Close))
- LClose = P.Tok.getLocation();
+ if (P.SkipUntil(Close, /*StopAtSemi*/ true, /*DontConsume*/ true))
+ LClose = P.ConsumeAnyToken();
return true;
}
diff --git a/clang/test/SemaCXX/decltype.cpp b/clang/test/SemaCXX/decltype.cpp
index f9bdececc4f..ccde3dcfb31 100644
--- a/clang/test/SemaCXX/decltype.cpp
+++ b/clang/test/SemaCXX/decltype.cpp
@@ -36,3 +36,10 @@ struct C {
C(decltype(undeclared; // expected-error {{undeclared identifier}} \
// expected-error {{expected ')'}} expected-note {{to match this '('}}
};
+
+template<typename>
+class conditional {
+};
+
+void foo(conditional<decltype((1),int>) { // expected-note 2 {{to match this '('}} expected-error {{expected ')'}}
+} // expected-error {{expected function body after function declarator}} expected-error 2 {{expected '>'}} expected-error {{expected ')'}}
OpenPOWER on IntegriCloud