From b4f0f3f3f7adcbaf1cd56e53ddb7af92afba2c58 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Wed, 26 Jun 2013 21:28:44 +0000 Subject: [PATCH] This patch fixes PR16395, when HandleMSProperty returns null due to a declaration with no name. Patch thanks to Robert Wilhelm. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185022 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclCXX.cpp | 39 ++++++++++++++-------------- test/SemaCXX/MicrosoftExtensions.cpp | 4 +++ 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 4e5e307be6..45cf57feea 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/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(CurContext), Loc, D, - BitWidth, InitStyle, AS, MSPropertyAttr); - isInstField = false; - } else { - Member = HandleField(S, cast(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(CurContext), Loc, D, + BitWidth, InitStyle, AS, MSPropertyAttr); + if (!Member) + return 0; + isInstField = false; + } else { + Member = HandleField(S, cast(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(Member)) { diff --git a/test/SemaCXX/MicrosoftExtensions.cpp b/test/SemaCXX/MicrosoftExtensions.cpp index 217fc6e6d7..e82c47eb58 100644 --- a/test/SemaCXX/MicrosoftExtensions.cpp +++ b/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}} +}; -- 2.50.1