diff options
| author | Aaron Ballman <aaron@aaronballman.com> | 2013-06-26 21:28:44 +0000 |
|---|---|---|
| committer | Aaron Ballman <aaron@aaronballman.com> | 2013-06-26 21:28:44 +0000 |
| commit | 2a6febc0c59f47118a53594014fc58da91a52fca (patch) | |
| tree | 847b17ecc890ff51f1ccf841cca0a37bc34540ce /clang | |
| parent | 23e297ff0a448b6164e556ed0ca6838c837c4822 (diff) | |
| download | bcm5719-llvm-2a6febc0c59f47118a53594014fc58da91a52fca.tar.gz bcm5719-llvm-2a6febc0c59f47118a53594014fc58da91a52fca.zip | |
This patch fixes PR16395, when HandleMSProperty returns null due to a declaration with no name.
Patch thanks to Robert Wilhelm.
llvm-svn: 185022
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 39 | ||||
| -rw-r--r-- | clang/test/SemaCXX/MicrosoftExtensions.cpp | 4 |
2 files changed, 24 insertions, 19 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 4e5e307be61..45cf57feea9 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1954,25 +1954,26 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, AttributeList *MSPropertyAttr = getMSPropertyAttr(D.getDeclSpec().getAttributes().getList()); - if (MSPropertyAttr) { - Member = HandleMSProperty(S, cast<CXXRecordDecl>(CurContext), Loc, D, - BitWidth, InitStyle, AS, MSPropertyAttr); - isInstField = false; - } else { - Member = HandleField(S, cast<CXXRecordDecl>(CurContext), Loc, D, - BitWidth, InitStyle, AS); - } - assert(Member && "HandleField never returns null"); - } else { - assert(InitStyle == ICIS_NoInit || D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static); - - Member = HandleDeclarator(S, D, TemplateParameterLists); - if (!Member) { - return 0; - } - - // Non-instance-fields can't have a bitfield. - if (BitWidth) { + if (MSPropertyAttr) {
+ Member = HandleMSProperty(S, cast<CXXRecordDecl>(CurContext), Loc, D,
+ BitWidth, InitStyle, AS, MSPropertyAttr);
+ if (!Member)
+ return 0;
+ isInstField = false;
+ } else {
+ Member = HandleField(S, cast<CXXRecordDecl>(CurContext), Loc, D,
+ BitWidth, InitStyle, AS);
+ assert(Member && "HandleField never returns null");
+ }
+ } else {
+ assert(InitStyle == ICIS_NoInit || D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static);
+
+ Member = HandleDeclarator(S, D, TemplateParameterLists);
+ if (!Member)
+ return 0;
+
+ // Non-instance-fields can't have a bitfield.
+ if (BitWidth) {
if (Member->isInvalidDecl()) { // don't emit another diagnostic. } else if (isa<VarDecl>(Member)) { diff --git a/clang/test/SemaCXX/MicrosoftExtensions.cpp b/clang/test/SemaCXX/MicrosoftExtensions.cpp index 217fc6e6d79..e82c47eb586 100644 --- a/clang/test/SemaCXX/MicrosoftExtensions.cpp +++ b/clang/test/SemaCXX/MicrosoftExtensions.cpp @@ -361,3 +361,7 @@ void SP11::UseV() { TakeRef(V); TakeVal(V); } + +struct StructWithUnnamedMember { + __declspec(property(get=GetV)) int : 10; // expected-error {{anonymous property is not supported}} +}; |

