diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticParseKinds.td | 2 | ||||
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/Parse/ParseExpr.cpp | 11 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 6 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx-member-pointer-op.cpp (renamed from clang/test/Parser/cxx-parse-member-pointer-op.cpp) | 12 |
5 files changed, 17 insertions, 16 deletions
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index 23d49fe75b7..3a8c5bf8f1b 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -117,8 +117,6 @@ def err_expected_semi_after_static_assert : Error< "expected ';' after static_assert">; def err_expected_semi_for : Error<"expected ';' in 'for' statement specifier">; def err_expected_colon_after : Error<"expected ':' after %0">; -def err_pointer_to_member_type : Error< - "invalid use of pointer to member type after %0">; def err_label_end_of_compound_statement : Error< "label at end of compound statement: expected statement">; def err_expected_string_literal : Error<"expected string literal">; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index ddd7d9fff5e..a864d8ab9e7 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -979,6 +979,8 @@ def err_template_arg_not_pointer_to_member_form : Error< "non-type template argument is not a pointer to member constant">; def err_template_arg_extra_parens : Error< "non-type template argument cannot be surrounded by parentheses">; +def err_pointer_to_member_type : Error< + "invalid use of pointer to member type after %select{.*|->*}0">; // C++ template specialization def err_template_spec_unknown_kind : Error< diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index 95a0e989471..d2b3b84eb7f 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -341,17 +341,6 @@ Parser::ParseRHSOfBinaryExpression(OwningExprResult LHS, unsigned MinPrec) { 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 0eea169b072..cf2c696c2b9 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1445,6 +1445,12 @@ QualType Sema::CheckPointerToMemberOperands( } } + if (isa<CXXZeroInitValueExpr>(rex)) { + // Diagnose use of pointer-to-member type which when used as + // the functional cast in a pointer-to-member expression. + Diag(Loc, diag::err_pointer_to_member_type) << isIndirect; + return QualType(); + } // C++ 5.5p2 // The result is an object or a function of the type specified by the // second operand. diff --git a/clang/test/Parser/cxx-parse-member-pointer-op.cpp b/clang/test/SemaCXX/cxx-member-pointer-op.cpp index cc2e8b142fc..88fe6ac166e 100644 --- a/clang/test/Parser/cxx-parse-member-pointer-op.cpp +++ b/clang/test/SemaCXX/cxx-member-pointer-op.cpp @@ -1,13 +1,19 @@ // RUN: clang-cc -fsyntax-only -pedantic -verify %s -struct C {}; +struct C { + static int (C::* a); +}; typedef void (C::*pmfc)(); void g(pmfc) { C *c; - c->*pmfc(); // expected-error {{invalid use of pointer to member type after '->*'}} + c->*pmfc(); // expected-error {{invalid use of pointer to member type after ->*}} C c1; - c1.*pmfc(); // expected-error {{invalid use of pointer to member type after '.*'}} + c1.*pmfc(); // expected-error {{invalid use of pointer to member type after .*}} +} + +int a(C* x) { + return x->*C::a; } |