diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 5d580c634827..7782e35e0d05 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3250,8 +3250,8 @@ def err_injected_decl_outside_cone : Error < def err_compute_expansion_size_index : Error< "could not compute %select{size|index}0 of expansion">; -def err_cannot_expand_over_type : Error< - "cannot expand over an expression of type %0">; +def err_expanded_identifier_label : Error< + "identifier labels are not allowed in expansion statements">; // C++11 char16_t/char32_t def warn_cxx98_compat_unicode_type : Warning< diff --git a/clang/lib/Sema/SemaExpand.cpp b/clang/lib/Sema/SemaExpand.cpp index 0d99639ae1b4..fdee54611bcd 100644 --- a/clang/lib/Sema/SemaExpand.cpp +++ b/clang/lib/Sema/SemaExpand.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "clang/AST/Decl.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Basic/DiagnosticSema.h" #include "clang/Lex/Preprocessor.h" #include "clang/Sema/EnterExpressionEvaluationContext.h" @@ -518,6 +519,18 @@ StmtResult Sema::FinishCXXExpansionStmt(Stmt *Heading, Stmt *Body) { if (!Heading || !Body) return StmtError(); + // Diagnose identifier labels. + struct DiagnoseLabels : DynamicRecursiveASTVisitor { + Sema &SemaRef; + DiagnoseLabels(Sema &S) : SemaRef(S) {} + bool VisitLabelStmt(LabelStmt *S) override { + SemaRef.Diag(S->getIdentLoc(), diag::err_expanded_identifier_label); + return false; + } + } Visitor(*this); + if (!Visitor.TraverseStmt(Body)) + return StmtError(); + CXXExpansionStmt *Expansion = cast(Heading); Expansion->setBody(Body);