a.makarov updated this revision to Diff 43442.
a.makarov added a comment.

Actual updated patch. Sorry for noise.


http://reviews.llvm.org/D15373

Files:
  include/clang/Sema/Sema.h
  lib/Sema/SemaDeclAttr.cpp
  lib/Sema/SemaType.cpp
  test/CodeGen/adding_defaulted_cc_attr_to_type.c
  test/Sema/callingconv.c

Index: lib/Sema/SemaType.cpp
===================================================================
--- lib/Sema/SemaType.cpp
+++ lib/Sema/SemaType.cpp
@@ -5856,7 +5856,8 @@
 
   // Otherwise, a calling convention.
   CallingConv CC;
-  if (S.CheckCallingConvAttr(attr, CC))
+  bool isDefaulted = false;
+  if (S.CheckCallingConvAttr(attr, CC, /*FD*/nullptr, &isDefaulted))
     return true;
 
   const FunctionType *fn = unwrapped.get();
@@ -5906,7 +5907,11 @@
   FunctionType::ExtInfo EI = unwrapped.get()->getExtInfo().withCallingConv(CC);
   QualType Equivalent =
       unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));
-  type = S.Context.getAttributedType(CCAttrKind, type, Equivalent);
+  // If calling convention was defaulted, we should not create attributed type
+  // with this attribute.
+  if (!isDefaulted)
+    type = S.Context.getAttributedType(CCAttrKind, type, Equivalent);
+
   return true;
 }
 
Index: lib/Sema/SemaDeclAttr.cpp
===================================================================
--- lib/Sema/SemaDeclAttr.cpp
+++ lib/Sema/SemaDeclAttr.cpp
@@ -3701,8 +3701,8 @@
   }
 }
 
-bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC, 
-                                const FunctionDecl *FD) {
+bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC,
+                                const FunctionDecl *FD, bool *Defaulted) {
   if (attr.isInvalid())
     return true;
 
@@ -3750,11 +3750,16 @@
   default: llvm_unreachable("unexpected attribute kind");
   }
 
+  if (Defaulted)
+    *Defaulted = false;
   const TargetInfo &TI = Context.getTargetInfo();
   TargetInfo::CallingConvCheckResult A = TI.checkCallingConvention(CC);
   if (A != TargetInfo::CCCR_OK) {
-    if (A == TargetInfo::CCCR_Warning)
+    if (A == TargetInfo::CCCR_Warning) {
       Diag(attr.getLoc(), diag::warn_cconv_ignored) << attr.getName();
+      if (Defaulted)
+        *Defaulted = true;
+    }
 
     // This convention is not valid for the target. Use the default function or
     // method calling convention.
Index: include/clang/Sema/Sema.h
===================================================================
--- include/clang/Sema/Sema.h
+++ include/clang/Sema/Sema.h
@@ -2937,8 +2937,9 @@
   bool isValidPointerAttrType(QualType T, bool RefOkay = false);
 
   bool CheckRegparmAttr(const AttributeList &attr, unsigned &value);
-  bool CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC, 
-                            const FunctionDecl *FD = nullptr);
+  bool CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC,
+                            const FunctionDecl *FD = nullptr,
+                            bool *Defaulted = nullptr);
   bool CheckNoReturnAttr(const AttributeList &attr);
   bool checkStringLiteralArgumentAttr(const AttributeList &Attr,
                                       unsigned ArgNum, StringRef &Str,
Index: test/CodeGen/adding_defaulted_cc_attr_to_type.c
===================================================================
--- test/CodeGen/adding_defaulted_cc_attr_to_type.c
+++ test/CodeGen/adding_defaulted_cc_attr_to_type.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -verify -emit-llvm -o - %s | FileCheck %s
+
+void (__attribute__ ((regparm (3), stdcall )) *f) (int); // expected-warning {{calling convention 'stdcall' ignored for this target}}
+
+// CHECK: @f = common global void (i32)*
+
+void (__attribute__((regparm(2), stdcall)) foo) () { // expected-warning {{calling convention 'stdcall' ignored for this target}}
+}
+
+// CHECK: define void @foo(){{.*}}
Index: test/Sema/callingconv.c
===================================================================
--- test/Sema/callingconv.c
+++ test/Sema/callingconv.c
@@ -66,3 +66,6 @@
 void __attribute__((stdcall)) typedef_fun(int x) { } // expected-error {{function declared 'stdcall' here was previously declared without calling convention}}
 
 struct type_test {} __attribute__((stdcall));  // expected-warning {{'stdcall' attribute only applies to functions and methods}}
+
+
+void (__attribute__ ((regparm (3), stdcall("abacaba") )) *test_ignored) (int); // expected-error {{'stdcall' attribute takes no arguments}}
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to