diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-10-23 21:01:39 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-10-23 21:01:39 +0000 |
commit | 9a14b84ac559e85672ce9c463eba7bf23ba4b6a2 (patch) | |
tree | 9998cc2d0c45d59d0624bb2fcc1da00374de24f9 /clang/lib | |
parent | 61ade258343e61915b92b8e8b9f75582ea403493 (diff) | |
download | bcm5719-llvm-9a14b84ac559e85672ce9c463eba7bf23ba4b6a2.tar.gz bcm5719-llvm-9a14b84ac559e85672ce9c463eba7bf23ba4b6a2.zip |
Diagnose misuse of '.*' and '->*' operators during parse
instead of crashing in code gen.
llvm-svn: 84968
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Parse/ParseExpr.cpp | 13 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 2 |
2 files changed, 13 insertions, 2 deletions
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index 8be89a89168..7d056fdebb9 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -340,7 +340,18 @@ Parser::ParseRHSOfBinaryExpression(OwningExprResult LHS, unsigned MinPrec) { // Eat the colon. ColonLoc = ConsumeToken(); } - + + if ((OpToken.is(tok::periodstar) || OpToken.is(tok::arrowstar)) + && Tok.is(tok::identifier)) { + CXXScopeSpec SS; + if (Actions.getTypeName(*Tok.getIdentifierInfo(), + Tok.getLocation(), CurScope, &SS)) { + const char *Opc = OpToken.is(tok::periodstar) ? "'.*'" : "'->*'"; + Diag(OpToken, diag::err_pointer_to_member_type) << Opc; + return ExprError(); + } + + } // Parse another leaf here for the RHS of the operator. // ParseCastExpression works here because all RHS expressions in C have it // as a prefix, at least. However, in C++, an assignment-expression could diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index ee19ff6b848..6f26ea1eeef 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -212,7 +212,7 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep, PDiag(diag::err_invalid_incomplete_type_use) << FullRange)) return ExprError(); - + if (RequireNonAbstractType(TyBeginLoc, Ty, diag::err_allocation_of_abstract_type)) return ExprError(); |