summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-10-23 21:01:39 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-10-23 21:01:39 +0000
commit9a14b84ac559e85672ce9c463eba7bf23ba4b6a2 (patch)
tree9998cc2d0c45d59d0624bb2fcc1da00374de24f9 /clang/lib
parent61ade258343e61915b92b8e8b9f75582ea403493 (diff)
downloadbcm5719-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.cpp13
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp2
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();
OpenPOWER on IntegriCloud