diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index a47c5ab3aaff7..00dcbff0f68e1 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -5291,10 +5291,8 @@ Decl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, // UNION_TYPE; <- where UNION_TYPE is a typedef union. if ((Tag && Tag->getDeclName()) || DS.getTypeSpecType() == DeclSpec::TST_typename) { - RecordDecl *Record = dyn_cast_or_null(Tag); - if (!Record) - Record = DS.getRepAsType().get()->getAsRecordDecl(); - + RecordDecl *Record = Tag ? dyn_cast(Tag) + : DS.getRepAsType().get()->getAsRecordDecl(); if (Record && getLangOpts().MicrosoftExt) { Diag(DS.getBeginLoc(), diag::ext_ms_anonymous_record) << Record->isUnion() << DS.getSourceRange(); diff --git a/clang/test/Sema/GH155794.c b/clang/test/Sema/GH155794.c new file mode 100644 index 0000000000000..1afbefaaae21a --- /dev/null +++ b/clang/test/Sema/GH155794.c @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wno-everything %s + +struct S { + enum e1 {} // expected-error {{use of empty enum}} expected-error {{expected ';' after enum}} + enum e2 {} // expected-error {{use of empty enum}} +}; // expected-error {{expected member name or ';' after declaration specifiers}}