diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index 273abe11830a..93f5bbcba80f 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -293,8 +293,6 @@ def err_default_arg_unparsed : Error< def err_dup_virtual : Error<"duplicate 'virtual' in base specifier">; // C++ operator overloading -def err_operator_missing_type_specifier : Error< - "missing type specifier after 'operator'">; def err_operator_string_not_empty : Error< "string literal after 'operator' must be '\"\"'">; diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp index 7b03757cdca5..1d09fe2a1afb 100644 --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -1005,7 +1005,7 @@ bool Parser::ParseCXXTypeSpecifierSeq(DeclSpec &DS) { // Parse one or more of the type specifiers. if (!ParseOptionalTypeSpecifier(DS, isInvalid, PrevSpec, DiagID, ParsedTemplateInfo(), /*SuppressDeclarations*/true)) { - Diag(Tok, diag::err_operator_missing_type_specifier); + Diag(Tok, diag::err_expected_type); return true; } diff --git a/clang/test/SemaCXX/invalid-member-expr.cpp b/clang/test/SemaCXX/invalid-member-expr.cpp index 7307a47f8282..37025d93344a 100644 --- a/clang/test/SemaCXX/invalid-member-expr.cpp +++ b/clang/test/SemaCXX/invalid-member-expr.cpp @@ -7,8 +7,8 @@ void test() { x.int; // expected-error{{expected unqualified-id}} x.~int(); // expected-error{{expected a class name}} - x.operator; // expected-error{{missing type specifier after 'operator'}} - x.operator typedef; // expected-error{{missing type specifier after 'operator'}} + x.operator; // expected-error{{expected a type}} + x.operator typedef; // expected-error{{expected a type}} } void test2() { @@ -16,8 +16,8 @@ void test2() { x->int; // expected-error{{expected unqualified-id}} x->~int(); // expected-error{{expected a class name}} - x->operator; // expected-error{{missing type specifier after 'operator'}} - x->operator typedef; // expected-error{{missing type specifier after 'operator'}} + x->operator; // expected-error{{expected a type}} + x->operator typedef; // expected-error{{expected a type}} } // PR6327 diff --git a/clang/test/SemaCXX/member-operator-expr.cpp b/clang/test/SemaCXX/member-operator-expr.cpp index 5e3d0c0a1bc8..ae5f8bb0ddb6 100644 --- a/clang/test/SemaCXX/member-operator-expr.cpp +++ b/clang/test/SemaCXX/member-operator-expr.cpp @@ -14,7 +14,7 @@ void test() { i = x.operator int(); x.operator--(); // expected-error{{no member named 'operator--'}} x.operator float(); // expected-error{{no member named 'operator float'}} - x.operator; // expected-error{{missing type specifier after 'operator'}} + x.operator; // expected-error{{expected a type}} } void test2() { @@ -25,5 +25,5 @@ void test2() { i = x->operator int(); x->operator--(); // expected-error{{no member named 'operator--'}} x->operator float(); // expected-error{{no member named 'operator float'}} - x->operator; // expected-error{{missing type specifier after 'operator'}} + x->operator; // expected-error{{expected a type}} } diff --git a/clang/test/SemaCXX/new-delete.cpp b/clang/test/SemaCXX/new-delete.cpp index f6129d19841b..19d5df6673ef 100644 --- a/clang/test/SemaCXX/new-delete.cpp +++ b/clang/test/SemaCXX/new-delete.cpp @@ -62,8 +62,8 @@ struct abstract { void bad_news(int *ip) { int i = 1; - (void)new; // expected-error {{missing type specifier}} - (void)new 4; // expected-error {{missing type specifier}} + (void)new; // expected-error {{expected a type}} + (void)new 4; // expected-error {{expected a type}} (void)new () int; // expected-error {{expected expression}} (void)new int[1.1]; // expected-error {{array size expression must have integral or enumerated type, not 'double'}} (void)new int[1][i]; // expected-error {{only the first dimension}} @@ -372,3 +372,9 @@ namespace PairedDelete { return new A(); } } + +namespace PR7702 { + void test1() { + new DoesNotExist; // expected-error {{expected a type}} + } +}