diff options
-rw-r--r-- | include/clang/Basic/DiagnosticKinds.def | 2 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 8 |
2 files changed, 10 insertions, 0 deletions
diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def index a9f60d2d63..52c6cbf2fa 100644 --- a/include/clang/Basic/DiagnosticKinds.def +++ b/include/clang/Basic/DiagnosticKinds.def @@ -593,6 +593,8 @@ DIAG(err_expected_unqualified_id, ERROR, "expected unqualified-id") DIAG(err_no_declarators, ERROR, "declaration does not declare anything") +DIAG(ext_no_declarators, EXTENSION, + "typedef without a name is a Microsoft extension") DIAG(err_func_def_no_params, ERROR, "function definition does not declare parameters") DIAG(err_expected_lparen_after_type, ERROR, diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 9b419e5b63..8d2e5590b9 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -875,7 +875,15 @@ Sema::DeclTy *Sema::ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS) { return Tag; } + // Permit typedefs without declarators as a Microsoft extension. if (!DS.isMissingDeclaratorOk()) { + if (getLangOptions().Microsoft && + DS.getStorageClassSpec() == DeclSpec::SCS_typedef) { + Diag(DS.getSourceRange().getBegin(), diag::ext_no_declarators) + << DS.getSourceRange(); + return Tag; + } + // FIXME: This diagnostic is emitted even when various previous // errors occurred (see e.g. test/Sema/decl-invalid.c). However, // DeclSpec has no means of communicating this information, and the |