summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Basic/DiagnosticParseKinds.td2
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Parse/ParseExpr.cpp11
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp6
-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;
}
OpenPOWER on IntegriCloud