# HG changeset patch # User Nikolay Krasilnikov # Date 1339681196 -14400 # Node ID 4ad983906532e4419e919fe0cc749c06e65773f7 # Parent 2a5611bc8c0948ef97908d2691797377e1574f0f fixed Bug 214111 - No code completion for auto variable diff --git a/cnd.completion/test/unit/data/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/Cpp11TestCase/bug214111.cpp b/cnd.completion/test/unit/data/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/Cpp11TestCase/bug214111.cpp new file mode 100644 --- /dev/null +++ b/cnd.completion/test/unit/data/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/Cpp11TestCase/bug214111.cpp @@ -0,0 +1,50 @@ +class MyQString +{ +public: + MyQString &append(char* c); +}; + +template +class MyQList +{ +public: + + struct MyNode { void *v; + T &t() + { return v ; } + }; + + class const_iterator; + + class const_iterator { + public: + MyNode *i; + + inline const_iterator() : i(0) {} + inline const_iterator(MyNode *n) : i(n) {} + inline const_iterator(const const_iterator &o): i(o.i) {} + + inline const T &operator*() const { return i->t(); } + inline const T *operator->() const { return &i->t(); } + + inline const_iterator &operator++() { ++i; return *this; } + inline const_iterator operator++(int) { MyNode *n = i; ++i; return n; } + }; + friend class const_iterator; + + // stl style + inline const_iterator constBegin() const {} + inline const_iterator constEnd() const {} + +}; + +class MyQStringList : public MyQList +{ +}; + +void bug214111_foo() { + const MyQStringList& lobuf; + for (auto&& Loit = lobuf.constBegin();Loit != lobuf.constEnd();Loit++) { + Loit->append("a"); + } +} \ No newline at end of file diff --git a/cnd.completion/test/unit/src/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/Cpp11TestCase.java b/cnd.completion/test/unit/src/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/Cpp11TestCase.java --- a/cnd.completion/test/unit/src/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/Cpp11TestCase.java +++ b/cnd.completion/test/unit/src/org/netbeans/modules/cnd/completion/cplusplus/hyperlink/Cpp11TestCase.java @@ -137,5 +137,10 @@ // Bug 210303 - Unresolved instantiation performTest("bug210303.cpp", 18, 11, "bug210303.cpp", 11, 9); } + + public void testBug214111() throws Exception { + // Bug 214111 - No code completion for auto variable + performTest("bug214111.cpp", 48, 23, "bug214111.cpp", 4, 5); + } } diff --git a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/Instantiation.java b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/Instantiation.java --- a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/Instantiation.java +++ b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/Instantiation.java @@ -1418,6 +1418,13 @@ return resolved; } } + if (CsmKindUtilities.isClass(resolved) && CsmKindUtilities.isClassMember(resolved)) { + CsmMember tdMember = (CsmMember)resolved; + if (CsmKindUtilities.isTemplate(tdMember.getContainingClass())) { + resolved = new Class((CsmClass)resolved, instantiation.getMapping()); + return resolved; + } + } } return resolved; } @@ -1587,6 +1594,13 @@ return resolved; } } + if (CsmKindUtilities.isClass(resolved) && CsmKindUtilities.isClassMember(resolved)) { + CsmMember tdMember = (CsmMember)resolved; + if (CsmKindUtilities.isTemplate(tdMember.getContainingClass())) { + resolved = new Class((CsmClass)resolved, instantiation.getMapping()); + return resolved; + } + } } return resolved; }