r225140 - Remove an assert that's not true on invalid code.
Richard Smith
richard at metafoo.co.uk
Sun Jan 4 16:30:47 PST 2015
Maybe we should fix this when we create the Expr rather than putting parse
error recovery logic in AST?
On 4 Jan 2015 20:37, "Nico Weber" <nicolasweber at gmx.de> wrote:
> Author: nico
> Date: Sun Jan 4 14:32:12 2015
> New Revision: 225140
>
> URL: http://llvm.org/viewvc/llvm-project?rev=225140&view=rev
> Log:
> Remove an assert that's not true on invalid code.
>
> r185773 added an assert that checked that a CXXUnresolvedConstructExpr
> either
> has a valid rparen, or exactly one argument. This doesn't have to be true
> for
> invalid inputs. Convert the assert to an if, and add a test for this case.
>
> Found by SLi's afl bot.
>
> Added:
> cfe/trunk/test/Misc/ast-dump-invalid.cpp
> Modified:
> cfe/trunk/include/clang/AST/ExprCXX.h
> cfe/trunk/test/SemaCXX/return.cpp
>
> Modified: cfe/trunk/include/clang/AST/ExprCXX.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=225140&r1=225139&r2=225140&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ExprCXX.h (original)
> +++ cfe/trunk/include/clang/AST/ExprCXX.h Sun Jan 4 14:32:12 2015
> @@ -2915,8 +2915,9 @@ public:
>
> SourceLocation getLocStart() const LLVM_READONLY;
> SourceLocation getLocEnd() const LLVM_READONLY {
> - assert(RParenLoc.isValid() || NumArgs == 1);
> - return RParenLoc.isValid() ? RParenLoc : getArg(0)->getLocEnd();
> + if (!RParenLoc.isValid() && NumArgs > 0)
> + return getArg(NumArgs - 1)->getLocEnd();
> + return RParenLoc;
> }
>
> static bool classof(const Stmt *T) {
>
> Added: cfe/trunk/test/Misc/ast-dump-invalid.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/ast-dump-invalid.cpp?rev=225140&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Misc/ast-dump-invalid.cpp (added)
> +++ cfe/trunk/test/Misc/ast-dump-invalid.cpp Sun Jan 4 14:32:12 2015
> @@ -0,0 +1,20 @@
> +// RUN: not %clang_cc1 -std=c++11 -triple x86_64-linux-gnu
> -fms-extensions -ast-dump -ast-dump-filter Test %s | FileCheck
> -check-prefix CHECK -strict-whitespace %s
> +
> +namespace TestInvalidRParenOnCXXUnresolvedConstructExpr {
> +template <class T>
> +void f(T i, T j) {
> + return T (i, j;
> +}
> +}
> +
> +// CHECK: NamespaceDecl {{.*}} <{{.*}}> {{.*}}
> TestInvalidRParenOnCXXUnresolvedConstructExpr
> +// CHECK-NEXT: `-FunctionTemplateDecl
> +// CHECK-NEXT: |-TemplateTypeParmDecl
> +// CHECK-NEXT: `-FunctionDecl
> +// CHECK-NEXT: |-ParmVarDecl
> +// CHECK-NEXT: |-ParmVarDecl
> +// CHECK-NEXT: `-CompoundStmt
> +// CHECK-NEXT: `-ReturnStmt
> +// CHECK-NEXT: `-CXXUnresolvedConstructExpr {{.*}} <col:10,
> col:16> 'T'
> +// CHECK-NEXT: |-DeclRefExpr {{.*}} <col:13> 'T' lvalue ParmVar
> {{.*}} 'i' 'T'
> +// CHECK-NEXT: `-DeclRefExpr {{.*}} <col:16> 'T' lvalue ParmVar
> {{.*}} 'j' 'T'
>
> Modified: cfe/trunk/test/SemaCXX/return.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/return.cpp?rev=225140&r1=225139&r2=225140&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/return.cpp (original)
> +++ cfe/trunk/test/SemaCXX/return.cpp Sun Jan 4 14:32:12 2015
> @@ -112,3 +112,11 @@ namespace ctor_returns_void {
> ~S() { return f(); } // expected-error {{destructor '~S' must not
> return void expression}}
> };
> }
> +
> +void cxx_unresolved_expr() {
> + // The use of an undeclared variable tricks clang into building a
> + // CXXUnresolvedConstructExpr, and the missing ')' gives it an invalid
> source
> + // location for its rparen. Check that emitting a diag on the range of
> the
> + // expr doesn't assert.
> + return int(undeclared, 4; // expected-error {{expected ')'}}
> expected-note{{to match this '('}} expected-error {{void function
> 'cxx_unresolved_expr' should not return a value}} expected-error {{use of
> undeclared identifier 'undeclared'}}
> +}
>
>
> _______________________________________________
> 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/20150104/dab9f966/attachment.html>
More information about the cfe-commits
mailing list