@rsmith: They have the "special" behavior for templates but only 
specializations matter, the primary template is not considered:
    template <typename T> inline void fun(T x);
    template <> extern inline void fun(int) {}

  However, this is refused by clang:
  > explicit specialization has extraneous, inconsistent storage class 'extern'

  @rnk: If mingw people are using `-fms-extensions`, they will not be effected 
at all in the C language mode because we require linkage to be `GVA_CXXInline`; 
those people will continue to get either their C99 or GNU semantics.  They 
would only be effected if the used C++ or `__inline`.  AFAICT, this extension 
is conforming if surprising.


================
Comment at: lib/AST/Decl.cpp:2587
@@ +2586,3 @@
+// the function to be required.
+bool FunctionDecl::isMSExternInline() const {
+  const ASTContext &Context = getASTContext();
----------------
Richard Smith wrote:
> You've put this between the helper function `RedeclForcesDefC99` and the 
> function that uses it; move it up above that function, please!
Will do, sorry about that!

================
Comment at: lib/AST/Decl.cpp:2596
@@ +2595,3 @@
+  do {
+    IsInlineSpecified |= FD->isInlineSpecified();
+    IsExternSpecified |= FD->getStorageClass() == SC_Extern;
----------------
Richard Smith wrote:
> I assume the idea here is to compute whether any declaration has the `inline` 
> keyword and to exclude the case where `inline` was implied by `constexpr` or 
> by being defined inside a class definition. Please add tests for those cases.
Sure, will do.

================
Comment at: lib/AST/Decl.cpp:2598-2599
@@ +2597,4 @@
+    IsExternSpecified |= FD->getStorageClass() == SC_Extern;
+    if (IsInlineSpecified && IsExternSpecified)
+      break;
+  } while ((FD = FD->getPreviousDecl()));
----------------
Richard Smith wrote:
> Do we really hit this special case if the `extern` and `inline` keywords are 
> on different declarations? (Again, add a test case please!)
Sure, will add some tests.

================
Comment at: lib/CodeGen/CodeGenModule.cpp:558
@@ +557,3 @@
+
+    // Functions specified with extern and inline in -fmicrosoft-extensions 
mode
+    // forcibly get emitted.  While the body of the function cannot be later
----------------
Reid Kleckner wrote:
> s/-fmicrosoft-extensions/-fms-extensions/
Done.

================
Comment at: test/CodeGen/inline.c:55
@@ -54,2 +54,3 @@
 // RUN: echo "MS C Mode tests:"
 // RUN: %clang_cc1 %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns 
-emit-llvm -o - -std=c99 -fms-compatibility | FileCheck %s --check-prefix=CHECK4
+// CHECK4-LABEL: define weak_odr i32 @ei()
----------------
Reid Kleckner wrote:
> This is -fms-compatibility.  Does that imply -fms-extensions?
Yep.


http://llvm-reviews.chandlerc.com/D3207
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to