From: Paul Robinson Date: Wed, 10 Dec 2014 23:34:36 +0000 (+0000) Subject: Diagnose attributes 'optnone' and 'minsize' on the same declaration. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0a37dbd750e8108554552b9fe4a0df8c9de23e65;p=clang Diagnose attributes 'optnone' and 'minsize' on the same declaration. Eventually we'll diagnose them on different declarations, but let's get this part out of the way first. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223985 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index ffb8b77a7d..9cace20ee1 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -3146,10 +3146,22 @@ static void handleAlwaysInlineAttr(Sema &S, Decl *D, Attr.getAttributeSpellingListIndex())); } +static void handleMinSizeAttr(Sema &S, Decl *D, + const AttributeList &Attr) { + if (checkAttrMutualExclusion(S, D, Attr)) + return; + + D->addAttr(::new (S.Context) + MinSizeAttr(Attr.getRange(), S.Context, + Attr.getAttributeSpellingListIndex())); +} + static void handleOptimizeNoneAttr(Sema &S, Decl *D, const AttributeList &Attr) { if (checkAttrMutualExclusion(S, D, Attr)) return; + if (checkAttrMutualExclusion(S, D, Attr)) + return; D->addAttr(::new (S.Context) OptimizeNoneAttr(Attr.getRange(), S.Context, @@ -4340,7 +4352,7 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, handleExtVectorTypeAttr(S, scope, D, Attr); break; case AttributeList::AT_MinSize: - handleSimpleAttribute(S, D, Attr); + handleMinSizeAttr(S, D, Attr); break; case AttributeList::AT_OptimizeNone: handleOptimizeNoneAttr(S, D, Attr); diff --git a/test/CodeGen/attr-optnone.c b/test/CodeGen/attr-optnone.c index 2a6e0d1d96..020218a2f4 100644 --- a/test/CodeGen/attr-optnone.c +++ b/test/CodeGen/attr-optnone.c @@ -9,7 +9,7 @@ __attribute__((always_inline)) int test2() { return 0; } // OPTSIZE: @test2{{.*}}[[ATTR2:#[0-9]+]] -__attribute__((optnone)) __attribute__((minsize)) +__attribute__((optnone)) int test3() { return 0; } // PRESENT-DAG: @test3{{.*}}[[ATTR3:#[0-9]+]] diff --git a/test/SemaCXX/attr-optnone.cpp b/test/SemaCXX/attr-optnone.cpp index eaa5000404..e2fce8e239 100644 --- a/test/SemaCXX/attr-optnone.cpp +++ b/test/SemaCXX/attr-optnone.cpp @@ -6,6 +6,9 @@ int bar() __attribute__((optnone)) __attribute__((noinline)); int baz() __attribute__((always_inline)) __attribute__((optnone)); // expected-error{{'always_inline' and 'optnone' attributes are not compatible}} int quz() __attribute__((optnone)) __attribute__((always_inline)); // expected-error{{'optnone' and 'always_inline' attributes are not compatible}} +int bay() __attribute__((minsize)) __attribute__((optnone)); // expected-error{{'minsize' and 'optnone' attributes are not compatible}} +int quy() __attribute__((optnone)) __attribute__((minsize)); // expected-error{{'optnone' and 'minsize' attributes are not compatible}} + __forceinline __attribute__((optnone)) int bax(); // expected-error{{'__forceinline' and 'optnone' attributes are not compatible}} __attribute__((optnone)) __forceinline int qux(); // expected-error{{'optnone' and '__forceinline' attributes are not compatible}} diff --git a/test/SemaCXX/pragma-optimize.cpp b/test/SemaCXX/pragma-optimize.cpp index 0a9f041070..b84d232b8a 100644 --- a/test/SemaCXX/pragma-optimize.cpp +++ b/test/SemaCXX/pragma-optimize.cpp @@ -55,6 +55,13 @@ int __attribute__((always_inline)) baz(int z) { } // CHECK-DAG: @_Z3bazi{{.*}} [[ATTRBAZ:#[0-9]+]] +// This function definition will not be decorated with `optnone` because the +// attribute would conflict with `minsize`. +int __attribute__((minsize)) bax(int z) { + return foo(z, 2); +} +// CHECK-DAG: @_Z3baxi{{.*}} [[ATTRBAX:#[0-9]+]] + #pragma clang optimize on // The function "int wombat(int param)" created by the macro is not @@ -144,6 +151,7 @@ int yet_another_normal(int x) { // Check that the other functions do NOT have optnone. // CHECK-DAG-NOT: attributes [[ATTRFOO]] = { {{.*}}optnone{{.*}} } // CHECK-DAG-NOT: attributes [[ATTRBAZ]] = { {{.*}}optnone{{.*}} } +// CHECK-DAG-NOT: attributes [[ATTRBAX]] = { {{.*}}optnone{{.*}} } // CHECK-DAG-NOT: attributes [[ATTRWOMBAT]] = { {{.*}}optnone{{.*}} } // CHECK-DAG-NOT: attributes [[ATTRCONTAINER]] = { {{.*}}optnone{{.*}} } // CHECK-DAG-NOT: attributes [[ATTRTWICE]] = { {{.*}}optnone{{.*}} }