summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorKai Pastor <dg0yt@darc.de>2016-04-03 09:44:36 +0200
committerKai Pastor <dg0yt@darc.de>2016-04-28 16:07:59 +0000
commit4ea581c95ae9704b250591c5d4d9b0517f5b62f2 (patch)
tree113919959a4296387d87b301ed93ceca1d494d46 /tests
parente1520db966debc5ad2d5dd26ec297073367697c1 (diff)
lupdate: Explicitly handle C++ member initializer lists
This change makes the cpp parser explicitly deal with parens and braces in member initializer lists of constructors. It fixes problems with C++11 syntax like list-initialization and lambdas. It adds auto tests for tr() calls in initialization expressions. The combination of parens in base class template parameters with list initialization (braces) remains unsupported. Task-number: QTBUG-34128 Task-number: QTBUG-42166 Change-Id: Id4ac0a011fcda8d2b72a15348a1b96fdd492ab32 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt2
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp111
-rw-r--r--tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result76
3 files changed, 189 insertions, 0 deletions
diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt b/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt
index c35c086c8..28f115561 100644
--- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt
+++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/expectedoutput.txt
@@ -2,4 +2,6 @@
.*/lupdate/testdata/good/parsecpp/finddialog.cpp:127: Qualifying with unknown namespace/class ::FindDialog
.*/lupdate/testdata/good/parsecpp/finddialog.cpp:167: Qualifying with unknown namespace/class ::FindDialog
.*/lupdate/testdata/good/parsecpp/finddialog.cpp:173: Unsupported encoding Latin1
+.*/lupdate/testdata/good/parsecpp/main.cpp:625: tr\(\) cannot be called without context
+.*/lupdate/testdata/good/parsecpp/main.cpp:627: tr\(\) cannot be called without context
lupdate warning: Message with id 'yet_another_id' has no source.
diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp b/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp
index 31783fd6a..5b6645689 100644
--- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp
+++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/main.cpp
@@ -516,3 +516,114 @@ void nullMacroInPlural()
QObject::tr("%n NULL(s)", NULL, 3);
QObject::tr("%n Q_NULLPTR(s)", Q_NULLPTR, 3);
}
+
+
+
+// QTBUG-34128: lupdate ignores tr() calls in constructor if a member is
+// initialized with C++11 initializer list
+class ListInitializationClass : public NameSchpase::YetMoreFun, Gui::BaseClass
+{
+ Q_OBJECT
+
+ ListInitializationClass() :
+ NameSchpase::YetMoreFun(),
+ Gui::BaseClass{ },
+ a{ 0 },
+ b(1),
+ c(tr("Hello World"))
+ {
+ tr("ListInitializationClass in-class constructor");
+ }
+
+ ListInitializationClass(int a);
+
+ ListInitializationClass(int a, int b, int c);
+
+ int a;
+ int b;
+ QString c;
+};
+
+ListInitializationClass::ListInitializationClass(int a) :
+ b{ { 2, 3 }[a] }
+{
+ tr("ListInitializationClass out-of-class single member initializer");
+}
+
+ListInitializationClass::ListInitializationClass(int a, int b, int c) :
+ NameSchpase::YetMoreFun{ },
+ Gui::BaseClass(),
+ a{ 2 + (a/3) },
+ b(b),
+ c{ tr("%n item(s)", Q_NULLPTR, c) }
+{
+ tr("ListInitializationClass out-of-class multi member initializer");
+}
+
+
+
+// QTBUG-42166: lupdate is confused by C++11 lambdas in constructor initializer lists
+class LambdaMemberClass : public Gui::BaseClass
+{
+ Q_OBJECT
+
+ LambdaMemberClass() :
+ Gui::BaseClass(),
+ a{ [](){ std::cout << QObject::tr("Hello"); } },
+ b([](){ std::cout << "World\n"; })
+ {
+ tr("LambdaMemberClass in-class constructor");
+ }
+
+ LambdaMemberClass(void *);
+
+ std::function<void()> a;
+ std::function<void()> b;
+};
+
+LambdaMemberClass::LambdaMemberClass(void *) :
+ Gui::BaseClass{ },
+ a([](){ std::cout << QObject::tr("Hallo "); }),
+ b{ [](){ std::cout << "Welt\n"; } }
+{
+ tr("LambdaMemberClass out-of-class constructor");
+}
+
+
+
+// Template parameters in base class initialization
+class TemplateClass : QVarLengthArray<char, sizeof(std::size_t)>, std::vector<int>
+{
+ Q_DECLARE_TR_FUNCTIONS(TemplateClass)
+ QString member;
+
+public:
+ TemplateClass() :
+ QVarLengthArray<char, sizeof(std::size_t)>(),
+ std::vector<int>(3),
+ member(tr("TemplateClass() in-class member initialization"))
+ {
+ tr("TemplateClass() in-class body");
+ }
+
+ TemplateClass(void *);
+ TemplateClass(int);
+};
+
+// supported: combination of parens in base class template parameter with direct initialization (parens)
+TemplateClass::TemplateClass(void *) :
+ QVarLengthArray<char, sizeof(std::size_t)>(),
+ std::vector<int>{ 1, 2 },
+ member{ tr("TemplateClass(void *) out-of-class member initialization") }
+{
+ tr("TemplateClass(void *) out-of-class body");
+}
+
+// not supported: combination of parens in base class template parameter with list initialization (braces)
+TemplateClass::TemplateClass(int) :
+ QVarLengthArray<char, sizeof(std::size_t)>{ 3, 4, 5 },
+ member(tr("[unsupported] TemplateClass(int) out-of-class member initialization"))
+{
+ tr("[unsupported] TemplateClass(int) out-of-class body");
+}
+
diff --git a/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result
index 4f301b2db..d72026b1c 100644
--- a/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result
+++ b/tests/auto/linguist/lupdate/testdata/good/parsecpp/project.ts.result
@@ -187,6 +187,49 @@ backslashed \ stuff.</source>
</message>
</context>
<context>
+ <name>LambdaMemberClass</name>
+ <message>
+ <location filename="main.cpp" line="575"/>
+ <source>LambdaMemberClass in-class constructor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="main.cpp" line="589"/>
+ <source>LambdaMemberClass out-of-class constructor</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListInitializationClass</name>
+ <message>
+ <location filename="main.cpp" line="533"/>
+ <source>Hello World</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="main.cpp" line="535"/>
+ <source>ListInitializationClass in-class constructor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="main.cpp" line="550"/>
+ <source>ListInitializationClass out-of-class single member initializer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location filename="main.cpp" line="558"/>
+ <source>%n item(s)</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="main.cpp" line="560"/>
+ <source>ListInitializationClass out-of-class multi member initializer</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>LotsaFun</name>
<message>
<location filename="main.cpp" line="310"/>
@@ -334,6 +377,16 @@ backslashed \ stuff.</source>
</translation>
</message>
<message>
+ <location filename="main.cpp" line="572"/>
+ <source>Hello</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="main.cpp" line="586"/>
+ <source>Hallo </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="included.cpp" line="34"/>
<source>message from #included .cpp file</source>
<translation type="unfinished"></translation>
@@ -386,6 +439,29 @@ backslashed \ stuff.</source>
</message>
</context>
<context>
+ <name>TemplateClass</name>
+ <message>
+ <location filename="main.cpp" line="604"/>
+ <source>TemplateClass() in-class member initialization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="main.cpp" line="606"/>
+ <source>TemplateClass() in-class body</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="main.cpp" line="617"/>
+ <source>TemplateClass(void *) out-of-class member initialization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="main.cpp" line="619"/>
+ <source>TemplateClass(void *) out-of-class body</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>TernaryClass</name>
<message>
<location filename="main.cpp" line="480"/>