Slightly improve the diagnostic when using a qualified function typedef to declare nonmember or static member functions.

llvm-svn: 108018
This commit is contained in:
Sebastian Redl 2010-07-09 21:26:08 +00:00
parent 6bc772eec7
commit 3e39272fed
3 changed files with 10 additions and 9 deletions

View File

@ -2158,8 +2158,8 @@ def err_invalid_member_use_in_static_method : Error<
def err_invalid_qualified_function_type : Error<
"type qualifier is not allowed on this function">;
def err_invalid_qualified_typedef_function_type_use : Error<
"a qualified function type cannot be used to declare a nonmember function "
"or a static member function">;
"a qualified function type cannot be used to declare a "
"%select{static member|nonmember}0 function">;
def err_invalid_non_static_member_use : Error<
"invalid use of nonstatic data member %0">;

View File

@ -1320,18 +1320,19 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
// for a nonstatic member function, the function type to which a pointer
// to member refers, or the top-level function type of a function typedef
// declaration.
bool FreeFunction = (D.getContext() != Declarator::MemberContext &&
(!D.getCXXScopeSpec().isSet() ||
!computeDeclContext(D.getCXXScopeSpec(), /*FIXME:*/true)->isRecord()));
if (FnTy->getTypeQuals() != 0 &&
D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
((D.getContext() != Declarator::MemberContext &&
(!D.getCXXScopeSpec().isSet() ||
!computeDeclContext(D.getCXXScopeSpec(), /*FIXME:*/true)
->isRecord())) ||
(FreeFunction ||
D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static)) {
if (D.isFunctionDeclarator())
Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_function_type);
else
Diag(D.getIdentifierLoc(),
diag::err_invalid_qualified_typedef_function_type_use);
diag::err_invalid_qualified_typedef_function_type_use)
<< FreeFunction;
// Strip the cv-quals from the type.
T = Context.getFunctionType(FnTy->getResultType(), FnTy->arg_type_begin(),

View File

@ -3,13 +3,13 @@
void f() const; // expected-error {{type qualifier is not allowed on this function}}
typedef void cfn() const;
cfn f2; // expected-error {{a qualified function type cannot be used to declare a nonmember function or a static member function}}
cfn f2; // expected-error {{a qualified function type cannot be used to declare a nonmember function}}
class C {
void f() const;
cfn f2;
static void f3() const; // expected-error {{type qualifier is not allowed on this function}}
static cfn f4; // expected-error {{a qualified function type cannot be used to declare a nonmember function or a static member function}}
static cfn f4; // expected-error {{a qualified function type cannot be used to declare a static member function}}
void m1() {
x = 0;