]> granicus.if.org Git - clang/commitdiff
Address post-commit review feedback to r270457
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 23 May 2016 17:32:35 +0000 (17:32 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 23 May 2016 17:32:35 +0000 (17:32 +0000)
Add two tests which show our error handling behavior for invalid
parameters in the layout_version and empty_bases attributes.

Amend our documentation to make it more clear that
__declspec(empty_bases) and __declspec(layout_version) can only apply to
classes, structs, and unions.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@270461 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/AttrDocs.td
test/SemaCXX/ms-empty_bases.cpp
test/SemaCXX/ms-layout_version.cpp

index e1c551648d4e9f60d178f385ac06fabb0ca64545..3f19772517ebfe42cf41c245d3972aed7d7bc1f2 100644 (file)
@@ -1558,6 +1558,7 @@ def EmptyBasesDocs : Documentation {
   let Content = [{
 The empty_bases attribute permits the compiler to utilize the
 empty-base-optimization more frequently.
+This attribute only applies to struct, class, and union types.
 It is only supported when using the Microsoft C++ ABI.
   }];
 }
@@ -1567,6 +1568,7 @@ def LayoutVersionDocs : Documentation {
   let Content = [{
 The layout_version attribute requests that the compiler utilize the class
 layout rules of a particular compiler version.
+This attribute only applies to struct, class, and union types.
 It is only supported when using the Microsoft C++ ABI.
   }];
 }
index 4452d558711e6d098961cb62e2c4db0bf60fc16b..69d9e2799b8ff2b515e37ef8ed9e224aef629c4d 100644 (file)
@@ -5,3 +5,5 @@ enum __declspec(empty_bases) E {}; // expected-warning{{'empty_bases' attribute
 int __declspec(empty_bases) I; // expected-warning{{'empty_bases' attribute only applies to classes}}
 typedef struct T __declspec(empty_bases) U; // expected-warning{{'empty_bases' attribute only applies to classes}}
 auto z = []() __declspec(empty_bases) { return nullptr; }; // expected-warning{{'empty_bases' attribute only applies to classes}}
+
+struct __declspec(empty_bases(1)) X {}; // expected-error{{'empty_bases' attribute takes no arguments}}
index b8a10341f23a2ddbd2b877c32ab092560fa8e89e..7f83b2d4473e014878d1b10b698e7670608680d0 100644 (file)
@@ -8,3 +8,4 @@ auto z = []() __declspec(layout_version(19)) { return nullptr; }; // expected-wa
 
 struct __declspec(layout_version(18)) X {}; // expected-error{{'layout_version' attribute parameter 18 is out of bounds}}
 struct __declspec(layout_version(20)) Y {}; // expected-error{{'layout_version' attribute parameter 20 is out of bounds}}
+struct __declspec(layout_version) Z {}; // expected-error{{attribute takes one argument}}