<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jan 7, 2015 at 1:16 PM, Kaelyn Takata <span dir="ltr"><<a href="mailto:rikka@google.com" target="_blank">rikka@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rikka<br>
Date: Wed Jan  7 15:16:39 2015<br>
New Revision: 225389<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=225389&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=225389&view=rev</a><br>
Log:<br>
Handle OpaqueValueExprs more intelligently in the TransformTypos tree<br>
transform.<br>
<br>
Also diagnose typos in the initializer of an invalid C++ declaration.<br>
Both issues were hit using the same line of test code, depending on<br>
whether the code was treated as C or C++.<br>
<br>
Fixes PR22092.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaDecl.cpp<br>
    cfe/trunk/lib/Sema/SemaExprCXX.cpp<br>
    cfe/trunk/test/Sema/typo-correction.c<br>
    cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=225389&r1=225388&r2=225389&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=225389&r1=225388&r2=225389&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Jan  7 15:16:39 2015<br>
@@ -8574,8 +8574,10 @@ void Sema::AddInitializerToDecl(Decl *Re<br>
                                 bool DirectInit, bool TypeMayContainAuto) {<br>
   // If there is no declaration, there was an error parsing it.  Just ignore<br>
   // the initializer.<br>
-  if (!RealDecl || RealDecl->isInvalidDecl())<br>
+  if (!RealDecl || RealDecl->isInvalidDecl()) {<br>
+    CorrectDelayedTyposInExpr(Init);<br>
     return;<br>
+  }<br>
<br>
   if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(RealDecl)) {<br>
     // With declarators parsed the way they are, the parser cannot<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=225389&r1=225388&r2=225389&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=225389&r1=225388&r2=225389&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Wed Jan  7 15:16:39 2015<br>
@@ -6141,6 +6141,12 @@ public:<br>
<br>
   ExprResult TransformLambdaExpr(LambdaExpr *E) { return Owned(E); }<br>
<br>
+  ExprResult TransformOpaqueValueExpr(OpaqueValueExpr *E) {<br>
+    if (Expr *SE = E->getSourceExpr())<br>
+      return TransformExpr(SE);<br>
+    return BaseTransform::TransformOpaqueValueExpr(E);<br>
+  }<br></blockquote><div><br></div><div>Hmm, can you instead handle this by overriding TreeTransform's AlreadyTransformed:</div><div><br></div><div>bool AlreadyTransformed(QualType T) {</div><div>  return T.isNull() || T->isInstantiationDependentType();</div><div>}</div><div><br></div><div>(Since we treat a TypoExpr as being dependent, it must lead to an instantiation-dependent type.)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
   ExprResult Transform(Expr *E) {<br>
     ExprResult Res;<br>
     while (true) {<br>
<br>
Modified: cfe/trunk/test/Sema/typo-correction.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/typo-correction.c?rev=225389&r1=225388&r2=225389&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/typo-correction.c?rev=225389&r1=225388&r2=225389&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Sema/typo-correction.c (original)<br>
+++ cfe/trunk/test/Sema/typo-correction.c Wed Jan  7 15:16:39 2015<br>
@@ -9,3 +9,6 @@ void PR21656() {<br>
   float x;<br>
   x = (float)arst;  // expected-error-re {{use of undeclared identifier 'arst'{{$}}}}<br>
 }<br>
+<br>
+a = b ? : 0;  // expected-warning {{type specifier missing, defaults to 'int'}} \<br>
+              // expected-error {{use of undeclared identifier 'b'}}<br>
<br>
Modified: cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp?rev=225389&r1=225388&r2=225389&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp?rev=225389&r1=225388&r2=225389&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/typo-correction-delayed.cpp Wed Jan  7 15:16:39 2015<br>
@@ -152,3 +152,8 @@ namespace PR21947 {<br>
 int blue;  // expected-note {{'blue' declared here}}<br>
 __typeof blur y;  // expected-error {{use of undeclared identifier 'blur'; did you mean 'blue'?}}<br>
 }<br>
+<br>
+namespace PR22092 {<br>
+a = b ? : 0;  // expected-error {{C++ requires a type specifier for all declarations}} \<br>
+              // expected-error-re {{use of undeclared identifier 'b'{{$}}}}<br>
+}<br>
<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>
</blockquote></div><br></div></div>