diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-11-23 13:53:21 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-11-23 13:53:21 +0000 |
commit | f21bac640870db0569e697a8a14f59f6ca069f80 (patch) | |
tree | 283d56514958cc2715da7769bf3af069b922c472 | |
parent | 84fb9c0be621c9e4ca4e56f67dae2a0bb6e44821 (diff) |
Require a class type to be complete before probing its conversion
functions for a switch condition's conversion to integral or
enumeration type.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89656 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | lib/Sema/SemaStmt.cpp | 7 | ||||
-rw-r--r-- | test/SemaCXX/switch.cpp | 7 |
3 files changed, 16 insertions, 0 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 95f65805d6..4032285f8d 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -2299,6 +2299,8 @@ def note_switch_conversion : Note< "conversion to %select{integral|enumeration}0 type %1">; def err_switch_explicit_conversion : Error< "switch condition type %0 requires explicit conversion to %1">; +def err_switch_incomplete_class_type : Error< + "switch condition has incomplete class type %0">; def warn_empty_if_body : Warning< "if statement has empty body">, InGroup<EmptyBody>; def err_va_start_used_in_non_variadic_function : Error< diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index b674a1738c..ad3376b9c8 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -391,6 +391,13 @@ Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, StmtArg Switch, // conversion is used in place of the original condition for the remainder // of this section. Integral promotions are performed. if (!CondExpr->isTypeDependent()) { + // Make sure that the condition expression has a complete type, + // otherwise we'll never find any conversions. + if (RequireCompleteType(SwitchLoc, CondType, + PDiag(diag::err_switch_incomplete_class_type) + << CondExpr->getSourceRange())) + return StmtError(); + llvm::SmallVector<CXXConversionDecl *, 4> ViableConversions; llvm::SmallVector<CXXConversionDecl *, 4> ExplicitConversions; if (const RecordType *RecordTy = CondType->getAs<RecordType>()) { diff --git a/test/SemaCXX/switch.cpp b/test/SemaCXX/switch.cpp index 2f2f2a9587..003d5b8b9c 100644 --- a/test/SemaCXX/switch.cpp +++ b/test/SemaCXX/switch.cpp @@ -33,3 +33,10 @@ void x2() { switch (B()) { // expected-error{{multiple conversions}} } } + +struct C; // expected-note{{forward declaration}} + +void x3(C &c) { + switch (c) { // expected-error{{incomplete class type}} + } +} |