http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/24083
FAIL: Clang :: CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp (1692 of 13357) ******************** TEST 'Clang :: CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp' FAILED ******************** Script: -- : 'RUN: at line 1'; /b/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/bin/clang -cc1 -internal-isystem /b/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/lib/clang/8.0.0/include -nostdsysteminc -std=c++11 -fsyntax-only -verify /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp : 'RUN: at line 2'; /b/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/bin/clang -cc1 -internal-isystem /b/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/lib/clang/8.0.0/include -nostdsysteminc -std=c++14 -fsyntax-only -verify /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp : 'RUN: at line 3'; /b/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/bin/clang -cc1 -internal-isystem /b/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/lib/clang/8.0.0/include -nostdsysteminc -std=c++17 -fsyntax-only -verify /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp -- Exit Code: 1 Command Output (stderr): -- /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/include/clang/Sema/Lookup.h:185:19: runtime error: load of value 32764, which is not a valid value for type 'typename std::remove_reference<AmbiguityKind &>::type' (aka 'clang::LookupResult::AmbiguityKind') #0 0x49b97ec in clang::LookupResult::LookupResult(clang::LookupResult&&) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/include/clang/Sema/Lookup.h:185:19 #1 0x49b8a2b in BuildNonArrayForRange(clang::Sema&, clang::Expr*, clang::Expr*, clang::QualType, clang::VarDecl*, clang::VarDecl*, clang::SourceLocation, clang::SourceLocation, clang::OverloadCandidateSet*, clang::ActionResult<clang::Expr*, true>*, clang::ActionResult<clang::Expr*, true>*, (anonymous namespace)::BeginEndFunction*)::$_3::operator()((anonymous namespace)::BeginEndFunction, clang::LookupResult&, llvm::function_ref<clang::Sema::ForRangeStatus ()>, llvm::function_ref<clang::Sema::ForRangeStatus ()>) const /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Sema/SemaStmt.cpp:2225:33 #2 0x49a5ed0 in BuildNonArrayForRange /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Sema/SemaStmt.cpp #3 0x49a5ed0 in clang::Sema::BuildCXXForRangeStmt(clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, clang::Stmt*, clang::Stmt*, clang::Stmt*, clang::Expr*, clang::Expr*, clang::Stmt*, clang::SourceLocation, clang::Sema::BuildForRangeKind) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Sema/SemaStmt.cpp:2497 #4 0x49a49df in clang::Sema::ActOnCXXForRangeStmt(clang::Scope*, clang::SourceLocation, clang::SourceLocation, clang::Stmt*, clang::SourceLocation, clang::Expr*, clang::SourceLocation, clang::Sema::BuildForRangeKind) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Sema/SemaStmt.cpp:2122:10 #5 0x41a3301 in clang::Parser::ParseForStatement(clang::SourceLocation*) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/ParseStmt.cpp:1762:28 #6 0x419fe76 in clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::AllowedConstructsKind, clang::SourceLocation*, clang::Parser::ParsedAttributesWithRange&) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/ParseStmt.cpp:251:12 #7 0x419f496 in clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::AllowedConstructsKind, clang::SourceLocation*) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/ParseStmt.cpp:110:20 #8 0x41a563b in clang::Parser::ParseCompoundStatementBody(bool) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/ParseStmt.cpp:997:11 #9 0x41a61c8 in clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/ParseStmt.cpp:1971:21 #10 0x410fde8 in clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/Parser.cpp:1246:10 #11 0x412cc1c in clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::SourceLocation*, clang::Parser::ForRangeInit*) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/ParseDecl.cpp:1968:11 #12 0x410e9ab in clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec&, clang::AccessSpecifier) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/Parser.cpp:1015:10 #13 0x410e167 in clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*, clang::AccessSpecifier) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/Parser.cpp:1031:12 #14 0x410d00d in clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/Parser.cpp:856:12 #15 0x410c331 in clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/Parser.cpp:610:12 #16 0x4106f84 in clang::ParseAST(clang::Sema&, bool, bool) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Parse/ParseAST.cpp:157:20 #17 0x3229ef5 in clang::FrontendAction::Execute() /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Frontend/FrontendAction.cpp:915:8 #18 0x31e02bf in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:964:11 #19 0x32ef915 in clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:259:25 #20 0x9fe4c3 in cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/driver/cc1_main.cpp:218:13 #21 0x9f90d5 in ExecuteCC1Tool /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/driver/driver.cpp:310:12 #22 0x9f90d5 in main /b/sanitizer-x86_64-linux-fast/build/llvm/tools/clang/tools/driver/driver.cpp:382 #23 0x7fe87da472e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0) #24 0x9e0a09 in _start (/b/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/bin/clang-8+0x9e0a09) On Mon, Sep 24, 2018 at 4:19 PM Richard Smith via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: rsmith > Date: Mon Sep 24 16:17:44 2018 > New Revision: 342925 > > URL: http://llvm.org/viewvc/llvm-project?rev=342925&view=rev > Log: > P0962R1: only use the member form of 'begin' and 'end' in a range-based > for loop if both members exist. > > This resolves a DR whereby an errant 'begin' or 'end' member in a base > class could result in a derived class not being usable as a range with > non-member 'begin' and 'end'. > > Modified: > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/lib/Sema/SemaStmt.cpp > cfe/trunk/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp > cfe/trunk/test/SemaCXX/for-range-dereference.cpp > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=342925&r1=342924&r2=342925&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Sep 24 > 16:17:44 2018 > @@ -2254,8 +2254,6 @@ def err_for_range_incomplete_type : Erro > "cannot use incomplete type %0 as a range">; > def err_for_range_iter_deduction_failure : Error< > "cannot use type %0 as an iterator">; > -def err_for_range_member_begin_end_mismatch : Error< > - "range type %0 has '%select{begin|end}1' member but no > '%select{end|begin}1' member">; > def ext_for_range_begin_end_types_differ : ExtWarn< > "'begin' and 'end' returning different types (%0 and %1) is a C++17 > extension">, > InGroup<CXX17>; > @@ -2268,6 +2266,8 @@ def note_in_for_range: Note< > def err_for_range_invalid: Error< > "invalid range expression of type %0; no viable '%select{begin|end}1' " > "function available">; > +def note_for_range_member_begin_end_ignored : Note< > + "member is not a candidate because range type %0 has no > '%select{end|begin}1' member">; > def err_range_on_array_parameter : Error< > "cannot build range expression with array function parameter %0 since " > "parameter with array type %1 is treated as pointer type %2">; > > Modified: cfe/trunk/lib/Sema/SemaStmt.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=342925&r1=342924&r2=342925&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaStmt.cpp (original) > +++ cfe/trunk/lib/Sema/SemaStmt.cpp Mon Sep 24 16:17:44 2018 > @@ -2149,6 +2149,56 @@ BuildNonArrayForRange(Sema &SemaRef, Exp > Sema::LookupMemberName); > LookupResult EndMemberLookup(SemaRef, EndNameInfo, > Sema::LookupMemberName); > > + auto BuildBegin = [&] { > + *BEF = BEF_begin; > + Sema::ForRangeStatus RangeStatus = > + SemaRef.BuildForRangeBeginEndCall(ColonLoc, ColonLoc, > BeginNameInfo, > + BeginMemberLookup, CandidateSet, > + BeginRange, BeginExpr); > + > + if (RangeStatus != Sema::FRS_Success) { > + if (RangeStatus == Sema::FRS_DiagnosticIssued) > + SemaRef.Diag(BeginRange->getBeginLoc(), diag::note_in_for_range) > + << ColonLoc << BEF_begin << BeginRange->getType(); > + return RangeStatus; > + } > + if (!CoawaitLoc.isInvalid()) { > + // FIXME: getCurScope() should not be used during template > instantiation. > + // We should pick up the set of unqualified lookup results for > operator > + // co_await during the initial parse. > + *BeginExpr = SemaRef.ActOnCoawaitExpr(SemaRef.getCurScope(), > ColonLoc, > + BeginExpr->get()); > + if (BeginExpr->isInvalid()) > + return Sema::FRS_DiagnosticIssued; > + } > + if (FinishForRangeVarDecl(SemaRef, BeginVar, BeginExpr->get(), > ColonLoc, > + > diag::err_for_range_iter_deduction_failure)) { > + NoteForRangeBeginEndFunction(SemaRef, BeginExpr->get(), *BEF); > + return Sema::FRS_DiagnosticIssued; > + } > + return Sema::FRS_Success; > + }; > + > + auto BuildEnd = [&] { > + *BEF = BEF_end; > + Sema::ForRangeStatus RangeStatus = > + SemaRef.BuildForRangeBeginEndCall(ColonLoc, ColonLoc, EndNameInfo, > + EndMemberLookup, CandidateSet, > + EndRange, EndExpr); > + if (RangeStatus != Sema::FRS_Success) { > + if (RangeStatus == Sema::FRS_DiagnosticIssued) > + SemaRef.Diag(EndRange->getBeginLoc(), diag::note_in_for_range) > + << ColonLoc << BEF_end << EndRange->getType(); > + return RangeStatus; > + } > + if (FinishForRangeVarDecl(SemaRef, EndVar, EndExpr->get(), ColonLoc, > + > diag::err_for_range_iter_deduction_failure)) { > + NoteForRangeBeginEndFunction(SemaRef, EndExpr->get(), *BEF); > + return Sema::FRS_DiagnosticIssued; > + } > + return Sema::FRS_Success; > + }; > + > if (CXXRecordDecl *D = RangeType->getAsCXXRecordDecl()) { > // - if _RangeT is a class type, the unqualified-ids begin and end are > // looked up in the scope of class _RangeT as if by class member > access > @@ -2156,68 +2206,62 @@ BuildNonArrayForRange(Sema &SemaRef, Exp > // declaration, begin-expr and end-expr are __range.begin() and > // __range.end(), respectively; > SemaRef.LookupQualifiedName(BeginMemberLookup, D); > + if (BeginMemberLookup.isAmbiguous()) > + return Sema::FRS_DiagnosticIssued; > + > SemaRef.LookupQualifiedName(EndMemberLookup, D); > + if (EndMemberLookup.isAmbiguous()) > + return Sema::FRS_DiagnosticIssued; > > if (BeginMemberLookup.empty() != EndMemberLookup.empty()) { > - SourceLocation RangeLoc = BeginVar->getLocation(); > - *BEF = BeginMemberLookup.empty() ? BEF_end : BEF_begin; > - > - SemaRef.Diag(RangeLoc, > diag::err_for_range_member_begin_end_mismatch) > - << RangeLoc << BeginRange->getType() << *BEF; > - return Sema::FRS_DiagnosticIssued; > + // Look up the non-member form of the member we didn't find, first. > + // This way we prefer a "no viable 'end'" diagnostic over a "i found > + // a 'begin' but ignored it because there was no member 'end'" > + // diagnostic. > + auto BuildNonmember = [&]( > + BeginEndFunction BEFFound, LookupResult &Found, > + llvm::function_ref<Sema::ForRangeStatus()> BuildFound, > + llvm::function_ref<Sema::ForRangeStatus()> BuildNotFound) { > + LookupResult OldFound = std::move(Found); > + Found.clear(); > + > + if (Sema::ForRangeStatus Result = BuildNotFound()) > + return Result; > + > + switch (BuildFound()) { > + case Sema::FRS_Success: > + return Sema::FRS_Success; > + > + case Sema::FRS_NoViableFunction: > + SemaRef.Diag(BeginRange->getBeginLoc(), > diag::err_for_range_invalid) > + << BeginRange->getType() << BEFFound; > + CandidateSet->NoteCandidates(SemaRef, OCD_AllCandidates, > BeginRange); > + LLVM_FALLTHROUGH; > + > + case Sema::FRS_DiagnosticIssued: > + for (NamedDecl *D : OldFound) { > + SemaRef.Diag(D->getLocation(), > + diag::note_for_range_member_begin_end_ignored) > + << BeginRange->getType() << BEFFound; > + } > + return Sema::FRS_DiagnosticIssued; > + } > + llvm_unreachable("unexpected ForRangeStatus"); > + }; > + if (BeginMemberLookup.empty()) > + return BuildNonmember(BEF_end, EndMemberLookup, BuildEnd, > BuildBegin); > + return BuildNonmember(BEF_begin, BeginMemberLookup, BuildBegin, > BuildEnd); > } > } else { > // - otherwise, begin-expr and end-expr are begin(__range) and > // end(__range), respectively, where begin and end are looked up > with > // argument-dependent lookup (3.4.2). For the purposes of this name > // lookup, namespace std is an associated namespace. > - > } > > - *BEF = BEF_begin; > - Sema::ForRangeStatus RangeStatus = > - SemaRef.BuildForRangeBeginEndCall(ColonLoc, ColonLoc, BeginNameInfo, > - BeginMemberLookup, CandidateSet, > - BeginRange, BeginExpr); > - > - if (RangeStatus != Sema::FRS_Success) { > - if (RangeStatus == Sema::FRS_DiagnosticIssued) > - SemaRef.Diag(BeginRange->getBeginLoc(), diag::note_in_for_range) > - << ColonLoc << BEF_begin << BeginRange->getType(); > - return RangeStatus; > - } > - if (!CoawaitLoc.isInvalid()) { > - // FIXME: getCurScope() should not be used during template > instantiation. > - // We should pick up the set of unqualified lookup results for > operator > - // co_await during the initial parse. > - *BeginExpr = SemaRef.ActOnCoawaitExpr(SemaRef.getCurScope(), ColonLoc, > - BeginExpr->get()); > - if (BeginExpr->isInvalid()) > - return Sema::FRS_DiagnosticIssued; > - } > - if (FinishForRangeVarDecl(SemaRef, BeginVar, BeginExpr->get(), ColonLoc, > - diag::err_for_range_iter_deduction_failure)) { > - NoteForRangeBeginEndFunction(SemaRef, BeginExpr->get(), *BEF); > - return Sema::FRS_DiagnosticIssued; > - } > - > - *BEF = BEF_end; > - RangeStatus = > - SemaRef.BuildForRangeBeginEndCall(ColonLoc, ColonLoc, EndNameInfo, > - EndMemberLookup, CandidateSet, > - EndRange, EndExpr); > - if (RangeStatus != Sema::FRS_Success) { > - if (RangeStatus == Sema::FRS_DiagnosticIssued) > - SemaRef.Diag(EndRange->getBeginLoc(), diag::note_in_for_range) > - << ColonLoc << BEF_end << EndRange->getType(); > - return RangeStatus; > - } > - if (FinishForRangeVarDecl(SemaRef, EndVar, EndExpr->get(), ColonLoc, > - diag::err_for_range_iter_deduction_failure)) { > - NoteForRangeBeginEndFunction(SemaRef, EndExpr->get(), *BEF); > - return Sema::FRS_DiagnosticIssued; > - } > - return Sema::FRS_Success; > + if (Sema::ForRangeStatus Result = BuildBegin()) > + return Result; > + return BuildEnd(); > } > > /// Speculatively attempt to dereference an invalid range expression. > > Modified: cfe/trunk/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp?rev=342925&r1=342924&r2=342925&view=diff > > ============================================================================== > --- cfe/trunk/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp (original) > +++ cfe/trunk/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp Mon Sep 24 > 16:17:44 2018 > @@ -150,9 +150,9 @@ void g() { > struct NoEnd { > null_t begin(); > }; > - for (auto u : NoBegin()) { // expected-error {{range type 'NoBegin' has > 'end' member but no 'begin' member}} > + for (auto u : NoBegin()) { // expected-error {{no viable 'begin' > function available}} > } > - for (auto u : NoEnd()) { // expected-error {{range type 'NoEnd' has > 'begin' member but no 'end' member}} > + for (auto u : NoEnd()) { // expected-error {{no viable 'end' function > available}} > } > > struct NoIncr { > @@ -271,3 +271,58 @@ namespace rdar13712739 { > > template void foo(const int&); // expected-note{{in instantiation of > function template specialization}} > } > + > +namespace p0962r1 { > + namespace NA { > + struct A { > + void begin(); > + }; > + int *begin(A); > + int *end(A); > + } > + > + namespace NB { > + struct B { > + void end(); > + }; > + int *begin(B); > + int *end(B); > + } > + > + namespace NC { > + struct C { > + void begin(); > + }; > + int *begin(C); > + } > + > + namespace ND { > + struct D { > + void end(); > + }; > + int *end(D); > + } > + > + namespace NE { > + struct E { > + void begin(); // expected-note {{member is not a candidate because > range type 'p0962r1::NE::E' has no 'end' member}} > + }; > + int *end(E); > + } > + > + namespace NF { > + struct F { > + void end(); // expected-note {{member is not a candidate because > range type 'p0962r1::NF::F' has no 'begin' member}} > + }; > + int *begin(F); > + } > + > + void use(NA::A a, NB::B b, NC::C c, ND::D d, NE::E e, NF::F f) { > + for (auto x : a) {} > + for (auto x : b) {} > + for (auto x : c) {} // expected-error {{no viable 'end' function}} > + for (auto x : d) {} // expected-error {{no viable 'begin' function}} > + for (auto x : e) {} // expected-error {{no viable 'begin' function}} > + for (auto x : f) {} // expected-error {{no viable 'end' function}} > + } > +} > > Modified: cfe/trunk/test/SemaCXX/for-range-dereference.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/for-range-dereference.cpp?rev=342925&r1=342924&r2=342925&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaCXX/for-range-dereference.cpp (original) > +++ cfe/trunk/test/SemaCXX/for-range-dereference.cpp Mon Sep 24 16:17:44 > 2018 > @@ -17,7 +17,7 @@ struct DeletedEnd : public T { > struct DeletedADLBegin { }; > > int* begin(DeletedADLBegin) = delete; //expected-note {{candidate > function has been explicitly deleted}} \ > - expected-note 5 {{candidate function not viable: no known conversion}} > + expected-note 6 {{candidate function not viable: no known conversion}} > > struct PrivateEnd { > Data *begin(); > @@ -27,7 +27,7 @@ struct PrivateEnd { > }; > > struct ADLNoEnd { }; > -Data * begin(ADLNoEnd); // expected-note 6 {{candidate function not > viable: no known conversion}} > +Data * begin(ADLNoEnd); // expected-note 7 {{candidate function not > viable: no known conversion}} > > struct OverloadedStar { > T operator*(); > @@ -45,7 +45,7 @@ void f() { > for (auto i : parr) { }// expected-error{{invalid range expression of > type 'int (*)[10]'; did you mean to dereference it with '*'?}} > > NoBegin NB; > - for (auto i : NB) { }// expected-error{{range type 'NoBegin' has 'end' > member but no 'begin' member}} > + for (auto i : NB) { }// expected-error{{invalid range expression of > type 'NoBegin'; no viable 'begin' function available}} > NoBegin *pNB; > for (auto i : pNB) { }// expected-error{{invalid range expression of > type 'NoBegin *'; no viable 'begin' function available}} > NoBegin **ppNB; > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits