Index: tools/clang/scripts/update.sh |
diff --git a/tools/clang/scripts/update.sh b/tools/clang/scripts/update.sh |
index b585440238b105018bda05007ac5d4bbefa7f584..7b964cc17e4d7500393bfc9d5cd66d489a41a52c 100755 |
--- a/tools/clang/scripts/update.sh |
+++ b/tools/clang/scripts/update.sh |
@@ -8,7 +8,7 @@ |
# Do NOT CHANGE this if you don't know what you're doing -- see |
# https://code.google.com/p/chromium/wiki/UpdatingClang |
# Reverting problematic clang rolls is safe, though. |
-CLANG_REVISION=223109 |
+CLANG_REVISION=223108 |
THIS_DIR="$(dirname "${0}")" |
LLVM_DIR="${THIS_DIR}/../../../third_party/llvm" |
@@ -244,6 +244,12 @@ for i in \ |
"${CLANG_DIR}/test/Frontend/exceptions.c" \ |
"${CLANG_DIR}/test/Preprocessor/predefined-exceptions.m" \ |
"${LLVM_DIR}/test/Bindings/Go/go.test" \ |
+ "${CLANG_DIR}/lib/Parse/ParseExpr.cpp" \ |
+ "${CLANG_DIR}/lib/Parse/ParseTemplate.cpp" \ |
+ "${CLANG_DIR}/lib/Sema/SemaDeclCXX.cpp" \ |
+ "${CLANG_DIR}/lib/Sema/SemaExprCXX.cpp" \ |
+ "${CLANG_DIR}/test/SemaCXX/default2.cpp" \ |
+ "${CLANG_DIR}/test/SemaCXX/typo-correction-delayed.cpp" \ |
; do |
if [[ -e "${i}" ]]; then |
rm -f "${i}" # For unversioned files. |
@@ -445,6 +451,229 @@ EOF |
patch -p1 |
popd |
+# Apply r223177: "Ensure typos in the default values of template parameters get diagnosed." |
+pushd "${CLANG_DIR}" |
+cat << 'EOF' | |
+--- a/lib/Parse/ParseTemplate.cpp |
++++ b/lib/Parse/ParseTemplate.cpp |
+@@ -676,7 +676,7 @@ Parser::ParseNonTypeTemplateParameter(unsigned Depth, unsigned Position) { |
+ GreaterThanIsOperatorScope G(GreaterThanIsOperator, false); |
+ EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated); |
+ |
+- DefaultArg = ParseAssignmentExpression(); |
++ DefaultArg = Actions.CorrectDelayedTyposInExpr(ParseAssignmentExpression()); |
+ if (DefaultArg.isInvalid()) |
+ SkipUntil(tok::comma, tok::greater, StopAtSemi | StopBeforeMatch); |
+ } |
+diff --git a/test/SemaCXX/default2.cpp b/test/SemaCXX/default2.cpp |
+index 1626044..c4d40b4 100644 |
+--- a/test/SemaCXX/default2.cpp |
++++ b/test/SemaCXX/default2.cpp |
+@@ -122,3 +122,9 @@ class XX { |
+ void A(int length = -1 ) { } |
+ void B() { A(); } |
+ }; |
++ |
++template <int I = (1 * I)> struct S {}; // expected-error-re {{use of undeclared identifier 'I'{{$}}}} |
++S<1> s; |
++ |
++template <int I1 = I2, int I2 = 1> struct T {}; // expected-error-re {{use of undeclared identifier 'I2'{{$}}}} |
++T<0, 1> t; |
+diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp |
+index bff1d76..7bf9258 100644 |
+--- a/test/SemaCXX/typo-correction-delayed.cpp |
++++ b/test/SemaCXX/typo-correction-delayed.cpp |
+@@ -102,3 +102,7 @@ void f(int *i) { |
+ __atomic_load(i, i, something_something); // expected-error-re {{use of undeclared identifier 'something_something'{{$}}}} |
+ } |
+ } |
++ |
++const int DefaultArg = 9; // expected-note {{'DefaultArg' declared here}} |
++template <int I = defaultArg> struct S {}; // expected-error {{use of undeclared identifier 'defaultArg'; did you mean 'DefaultArg'?}} |
++S<1> s; |
+EOF |
+patch -p1 |
+popd |
+ |
+# Apply r223209: "Handle delayed corrections in a couple more error paths in ParsePostfixExpressionSuffix." |
+pushd "${CLANG_DIR}" |
+cat << 'EOF' | |
+--- a/lib/Parse/ParseExpr.cpp |
++++ b/lib/Parse/ParseExpr.cpp |
+@@ -1390,6 +1390,7 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { |
+ SourceLocation OpenLoc = ConsumeToken(); |
+ |
+ if (ParseSimpleExpressionList(ExecConfigExprs, ExecConfigCommaLocs)) { |
++ (void)Actions.CorrectDelayedTyposInExpr(LHS); |
+ LHS = ExprError(); |
+ } |
+ |
+@@ -1440,6 +1441,7 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { |
+ if (Tok.isNot(tok::r_paren)) { |
+ if (ParseExpressionList(ArgExprs, CommaLocs, &Sema::CodeCompleteCall, |
+ LHS.get())) { |
++ (void)Actions.CorrectDelayedTyposInExpr(LHS); |
+ LHS = ExprError(); |
+ } |
+ } |
+diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp |
+index 7bf9258..f7ef015 100644 |
+--- a/test/SemaCXX/typo-correction-delayed.cpp |
++++ b/test/SemaCXX/typo-correction-delayed.cpp |
+@@ -106,3 +106,9 @@ void f(int *i) { |
+ const int DefaultArg = 9; // expected-note {{'DefaultArg' declared here}} |
+ template <int I = defaultArg> struct S {}; // expected-error {{use of undeclared identifier 'defaultArg'; did you mean 'DefaultArg'?}} |
+ S<1> s; |
++ |
++namespace foo {} |
++void test_paren_suffix() { |
++ foo::bar({5, 6}); // expected-error-re {{no member named 'bar' in namespace 'foo'{{$}}}} \ |
++ // expected-error {{expected expression}} |
++} |
+EOF |
+patch -p1 |
+popd |
+ |
+# Apply r223705: "Handle possible TypoExprs in member initializers." |
+pushd "${CLANG_DIR}" |
+cat << 'EOF' | |
+--- a/lib/Sema/SemaDeclCXX.cpp |
++++ b/lib/Sema/SemaDeclCXX.cpp |
+@@ -2813,6 +2813,11 @@ Sema::BuildMemInitializer(Decl *ConstructorD, |
+ SourceLocation IdLoc, |
+ Expr *Init, |
+ SourceLocation EllipsisLoc) { |
++ ExprResult Res = CorrectDelayedTyposInExpr(Init); |
++ if (!Res.isUsable()) |
++ return true; |
++ Init = Res.get(); |
++ |
+ if (!ConstructorD) |
+ return true; |
+ |
+diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp |
+index f7ef015..d303b58 100644 |
+--- a/test/SemaCXX/typo-correction-delayed.cpp |
++++ b/test/SemaCXX/typo-correction-delayed.cpp |
+@@ -112,3 +112,10 @@ void test_paren_suffix() { |
+ foo::bar({5, 6}); // expected-error-re {{no member named 'bar' in namespace 'foo'{{$}}}} \ |
+ // expected-error {{expected expression}} |
+ } |
++ |
++const int kNum = 10; // expected-note {{'kNum' declared here}} |
++class SomeClass { |
++ int Kind; |
++public: |
++ explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}} |
++}; |
+EOF |
+patch -p1 |
+popd |
+ |
+# Apply r224172: "Typo correction: Ignore temporary binding exprs after overload resolution" |
+pushd "${CLANG_DIR}" |
+cat << 'EOF' | |
+--- a/lib/Sema/SemaExprCXX.cpp |
++++ b/lib/Sema/SemaExprCXX.cpp |
+@@ -6105,8 +6105,13 @@ public: |
+ auto Result = BaseTransform::RebuildCallExpr(Callee, LParenLoc, Args, |
+ RParenLoc, ExecConfig); |
+ if (auto *OE = dyn_cast<OverloadExpr>(Callee)) { |
+- if (!Result.isInvalid() && Result.get()) |
+- OverloadResolution[OE] = cast<CallExpr>(Result.get())->getCallee(); |
++ if (!Result.isInvalid() && Result.get()) { |
++ Expr *ResultCall = Result.get(); |
++ if (auto *BE = dyn_cast<CXXBindTemporaryExpr>(ResultCall)) |
++ ResultCall = BE->getSubExpr(); |
++ if (auto *CE = dyn_cast<CallExpr>(ResultCall)) |
++ OverloadResolution[OE] = CE->getCallee(); |
++ } |
+ } |
+ return Result; |
+ } |
+diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp |
+index d303b58..d42888f 100644 |
+--- a/test/SemaCXX/typo-correction-delayed.cpp |
++++ b/test/SemaCXX/typo-correction-delayed.cpp |
+@@ -119,3 +119,23 @@ class SomeClass { |
+ public: |
+ explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}} |
+ }; |
++ |
++extern "C" int printf(const char *, ...); |
++ |
++// There used to be an issue with typo resolution inside overloads. |
++struct AssertionResult { |
++ ~AssertionResult(); |
++ operator bool(); |
++ int val; |
++}; |
++AssertionResult Compare(const char *a, const char *b); |
++AssertionResult Compare(int a, int b); |
++int main() { |
++ // expected-note@+1 {{'result' declared here}} |
++ const char *result; |
++ // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}} |
++ if (AssertionResult ar = (Compare("value1", resulta))) |
++ ; |
++ else |
++ printf("ar: %d\n", ar.val); |
++} |
+EOF |
+patch -p1 |
+popd |
+ |
+# Apply r224173: "Implement feedback on r224172 in PR21899" |
+pushd "${CLANG_DIR}" |
+cat << 'EOF' | |
+--- a/lib/Sema/SemaExprCXX.cpp |
++++ b/lib/Sema/SemaExprCXX.cpp |
+@@ -6105,7 +6105,7 @@ public: |
+ auto Result = BaseTransform::RebuildCallExpr(Callee, LParenLoc, Args, |
+ RParenLoc, ExecConfig); |
+ if (auto *OE = dyn_cast<OverloadExpr>(Callee)) { |
+- if (!Result.isInvalid() && Result.get()) { |
++ if (Result.isUsable()) { |
+ Expr *ResultCall = Result.get(); |
+ if (auto *BE = dyn_cast<CXXBindTemporaryExpr>(ResultCall)) |
+ ResultCall = BE->getSubExpr(); |
+diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp |
+index d42888f..7879d29 100644 |
+--- a/test/SemaCXX/typo-correction-delayed.cpp |
++++ b/test/SemaCXX/typo-correction-delayed.cpp |
+@@ -120,22 +120,13 @@ public: |
+ explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}} |
+ }; |
+ |
+-extern "C" int printf(const char *, ...); |
+- |
+ // There used to be an issue with typo resolution inside overloads. |
+-struct AssertionResult { |
+- ~AssertionResult(); |
+- operator bool(); |
+- int val; |
+-}; |
+-AssertionResult Compare(const char *a, const char *b); |
+-AssertionResult Compare(int a, int b); |
+-int main() { |
++struct AssertionResult { ~AssertionResult(); }; |
++AssertionResult Overload(const char *a); |
++AssertionResult Overload(int a); |
++void UseOverload() { |
+ // expected-note@+1 {{'result' declared here}} |
+ const char *result; |
+ // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}} |
+- if (AssertionResult ar = (Compare("value1", resulta))) |
+- ; |
+- else |
+- printf("ar: %d\n", ar.val); |
++ Overload(resulta); |
+ } |
+EOF |
+patch -p1 |
+popd |
+ |
+ |
# This Go bindings test doesn't work after the bootstrap build on Linux. (PR21552) |
pushd "${LLVM_DIR}" |
cat << 'EOF' | |