diff options
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 15 | ||||
| -rw-r--r-- | clang/test/CXX/over/over.built/p25.cpp | 15 |
2 files changed, 27 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 4fef397f37a..d2f6ee725d5 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -5255,9 +5255,9 @@ Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, // contextually converted to bool long ago. The candidates below are // therefore added as binary. // - // C++ [over.built]p24: - // For every type T, where T is a pointer or pointer-to-member type, - // there exist candidate operator functions of the form + // C++ [over.built]p25: + // For every type T, where T is a pointer, pointer-to-member, or scoped + // enumeration type, there exist candidate operator functions of the form // // T operator?(bool, T, T); // @@ -5272,6 +5272,15 @@ Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, QualType ParamTypes[2] = { *Ptr, *Ptr }; AddBuiltinCandidate(*Ptr, ParamTypes, Args, 2, CandidateSet); } + if (getLangOptions().CPlusPlus0x) + for (BuiltinCandidateTypeSet::iterator Enum = + CandidateTypes.enumeration_begin(), + E = CandidateTypes.enumeration_end(); Enum != E; ++Enum) { + if (!(*Enum)->getAs<EnumType>()->getDecl()->isScoped()) + continue; + QualType ParamTypes[2] = { *Enum, *Enum }; + AddBuiltinCandidate(*Enum, ParamTypes, Args, 2, CandidateSet); + } goto Conditional; } } diff --git a/clang/test/CXX/over/over.built/p25.cpp b/clang/test/CXX/over/over.built/p25.cpp new file mode 100644 index 00000000000..c185fb4fb96 --- /dev/null +++ b/clang/test/CXX/over/over.built/p25.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %s + +enum class Color { Red, Green, Blue }; + +struct ConvertsToColorA { + operator Color(); +}; + +struct ConvertsToColorB { + operator Color(); +}; + +Color foo(bool cond, ConvertsToColorA ca, ConvertsToColorB cb) { + return cond? ca : cb; +} |

