]> granicus.if.org Git - clang/commitdiff
Revert "Fix for PR6953: per gcc, regparm and noreturn affect the compatibility of...
authorDaniel Dunbar <daniel@zuster.org>
Wed, 28 Apr 2010 16:20:58 +0000 (16:20 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 28 Apr 2010 16:20:58 +0000 (16:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102501 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
test/Sema/attr-regparm.c

index 868054fe0ecf602d5bec3bda5ee9acb379178706..4d7ea40079ccd4b8fb5712a794135e2099a8145d 100644 (file)
@@ -4311,16 +4311,21 @@ QualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs,
     allLTypes = false;
   if (getCanonicalType(retType) != getCanonicalType(rbase->getResultType()))
     allRTypes = false;
-
-  // Check misc function attributes
+  // FIXME: double check this
+  // FIXME: should we error if lbase->getRegParmAttr() != 0 &&
+  //                           rbase->getRegParmAttr() != 0 &&
+  //                           lbase->getRegParmAttr() != rbase->getRegParmAttr()?
   FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo();
   FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo();
-  // Per gcc, compatible functions must have compatible regparm and noreturn
-  // attributes.
-  unsigned RegParm = lbaseInfo.getRegParm();
-  bool NoReturn = lbaseInfo.getNoReturn();
-  if (NoReturn != rbaseInfo.getNoReturn() || RegParm != rbaseInfo.getRegParm())
-    return QualType();
+  unsigned RegParm = lbaseInfo.getRegParm() == 0 ? rbaseInfo.getRegParm() :
+      lbaseInfo.getRegParm();
+  bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn();
+  if (NoReturn != lbaseInfo.getNoReturn() ||
+      RegParm != lbaseInfo.getRegParm())
+    allLTypes = false;
+  if (NoReturn != rbaseInfo.getNoReturn() ||
+      RegParm != rbaseInfo.getRegParm())
+    allRTypes = false;
   CallingConv lcc = lbaseInfo.getCC();
   CallingConv rcc = rbaseInfo.getCC();
   // Compatible functions must have compatible calling conventions
index 57640978757d64906909293809c33bc22f3c8a9a..045a41396e3f2ab0501caaf9894528392bba6479 100644 (file)
@@ -1,11 +1,7 @@
 // RUN: %clang_cc1 -triple i386-apple-darwin9 -fsyntax-only -verify %s
 
-__attribute((regparm(2))) int a(void);
-__attribute((regparm(1.0))) int b(void); // expected-error{{'regparm' attribute requires integer constant}}
-__attribute((regparm(-1))) int c(void); // expected-error{{'regparm' parameter must be between 0 and 3 inclusive}}
-__attribute((regparm(5))) int d(void); // expected-error{{'regparm' parameter must be between 0 and 3 inclusive}}
-__attribute((regparm(5,3))) int e(void); // expected-error{{attribute requires 1 argument(s)}}
-int f(void);
-__attribute((regparm(0))) int f(void);
-__attribute((regparm(1))) int g(void); // expected-note{{previous declaration is here}}
-__attribute((regparm(2))) int g(void); // expected-error{{conflicting types for 'g'}}
+__attribute((regparm(2))) int x(void);
+__attribute((regparm(1.0))) int x(void); // expected-error{{'regparm' attribute requires integer constant}}
+__attribute((regparm(-1))) int x(void); // expected-error{{'regparm' parameter must be between 0 and 3 inclusive}}
+__attribute((regparm(5))) int x(void); // expected-error{{'regparm' parameter must be between 0 and 3 inclusive}}
+__attribute((regparm(5,3))) int x(void); // expected-error{{attribute requires 1 argument(s)}}