]> granicus.if.org Git - clang/commitdiff
Slightly improve the diagnostic when using a qualified function typedef to declare...
authorSebastian Redl <sebastian.redl@getdesigned.at>
Fri, 9 Jul 2010 21:26:08 +0000 (21:26 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Fri, 9 Jul 2010 21:26:08 +0000 (21:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108018 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaType.cpp
test/SemaCXX/function-type-qual.cpp

index 5ff1f0896fb1a6b7b4e5924ea5dd89cfffb92fc6..e3792c1178aae74eb4b46f8e5d5b2ad6567891fa 100644 (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">;
index 244f218860c495955bd957df8d2c97a4d83072f1..48bf7cbac4e82e68086c7e3444f33725484b3e18 100644 (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(),
index be61f2ba5639525d0d411fb047c5d2dfe10756f7..ec27748900710a22dfd4f2729fba0989aba1bddb 100644 (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;