forked from OSchip/llvm-project
Make sure that we diagnose invalid qualifiers on friend functions.
llvm-svn: 116527
This commit is contained in:
parent
25c9d1170b
commit
c3bbf48f47
|
|
@ -1403,13 +1403,16 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
|
|||
const FunctionProtoType *FnTy = T->getAs<FunctionProtoType>();
|
||||
assert(FnTy && "Why oh why is there not a FunctionProtoType here?");
|
||||
|
||||
// C++ 8.3.5p4: A cv-qualifier-seq shall only be part of the function type
|
||||
// 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 &&
|
||||
// C++ 8.3.5p4:
|
||||
// A cv-qualifier-seq shall only be part of the function type
|
||||
// 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.getDeclSpec().isFriendSpecified()) &&
|
||||
(!D.getCXXScopeSpec().isSet() ||
|
||||
!computeDeclContext(D.getCXXScopeSpec(), /*FIXME:*/true)->isRecord()));
|
||||
!computeDeclContext(D.getCXXScopeSpec(), /*FIXME:*/true)->isRecord());
|
||||
if (FnTy->getTypeQuals() != 0 &&
|
||||
D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
|
||||
(FreeFunction ||
|
||||
|
|
|
|||
|
|
@ -57,7 +57,8 @@ class A {
|
|||
friend A operator|(const A& l, const A& r); // okay
|
||||
friend A operator|(const A& r); // expected-error {{ overloaded 'operator|' must be a binary operator (has 1 parameter) }}
|
||||
|
||||
friend operator bool() const; // expected-error {{ must use a qualified name when declaring a conversion operator as a friend }}
|
||||
friend operator bool() const; // expected-error {{ must use a qualified name when declaring a conversion operator as a friend }} \
|
||||
// expected-error{{type qualifier is not allowed on this function}}
|
||||
|
||||
typedef void ftypedef();
|
||||
friend ftypedef typedeffed_function; // okay (because it's not declared as a member)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
void f() const; // expected-error{{type qualifier is not allowed on this function}}
|
||||
|
||||
struct X {
|
||||
void f() const;
|
||||
friend void g() const; // expected-error{{type qualifier is not allowed on this function}}
|
||||
static void h() const; // expected-error{{type qualifier is not allowed on this function}}
|
||||
};
|
||||
|
||||
struct Y {
|
||||
friend void X::f() const;
|
||||
friend void ::f() const; // expected-error{{type qualifier is not allowed on this function}}
|
||||
};
|
||||
Loading…
Reference in New Issue