r195050 - The attached patch is a follow up from my previous one. The existing

Rafael Espindola rafael.espindola at gmail.com
Mon Nov 18 14:40:04 PST 2013


Author: rafael
Date: Mon Nov 18 16:40:04 2013
New Revision: 195050

URL: http://llvm.org/viewvc/llvm-project?rev=195050&view=rev
Log:
The attached patch is a follow up from my previous one. The existing
logic was not handling typedefs as free functions. This was not
causing problems with the existing tests, but does with the microsoft
abi where they have to get a different calling convention.

I will try to refactor this into a method on Declarator in a second.

Modified:
    cfe/trunk/lib/Sema/SemaType.cpp
    cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp

Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=195050&r1=195049&r2=195050&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Mon Nov 18 16:40:04 2013
@@ -3240,9 +3240,11 @@ static TypeSourceInfo *GetFullTypeForDec
     // top-level template type arguments.
     bool FreeFunction;
     if (!D.getCXXScopeSpec().isSet()) {
-      FreeFunction = ((D.getContext() != Declarator::MemberContext &&
-                       D.getContext() != Declarator::LambdaExprContext) ||
-                      D.getDeclSpec().isFriendSpecified());
+      const DeclSpec &Spec = D.getDeclSpec();
+      FreeFunction = (D.getContext() != Declarator::MemberContext &&
+                      D.getContext() != Declarator::LambdaExprContext) ||
+                     Spec.isFriendSpecified() ||
+                     Spec.getStorageClassSpec() == DeclSpec::SCS_typedef;
     } else {
       DeclContext *DC = S.computeDeclContext(D.getCXXScopeSpec());
       FreeFunction = (DC && !DC->isRecord());

Modified: cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp?rev=195050&r1=195049&r2=195050&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp (original)
+++ cfe/trunk/test/SemaCXX/decl-microsoft-call-conv.cpp Mon Nov 18 16:40:04 2013
@@ -167,3 +167,12 @@ namespace test2 {
   };
   extern template void foo::bar(const void *);
 }
+
+namespace test3 {
+  struct foo {
+    typedef void bar();
+  };
+  bool zed(foo::bar *);
+  void bah() {}
+  void baz() { zed(bah); }
+}





More information about the cfe-commits mailing list