From b27b3691302dabac7fe47fe0dd791a22f55e0571 Mon Sep 17 00:00:00 2001 From: Matheus Izvekov Date: Thu, 28 Aug 2025 15:16:59 -0300 Subject: [PATCH] [clang] fix regression parsing C enum which doesn't declare anything The regression was introduced in #155313 Since this regression was never released, there are no release notes. Fixes #155794 --- clang/lib/Sema/SemaDecl.cpp | 6 ++---- clang/test/Sema/GH155794.c | 6 ++++++ 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 clang/test/Sema/GH155794.c 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}}