Closed
Bug 669693
Opened 13 years ago
Closed 13 years ago
Dehydra: Unhandled type_pack_expansion/decltype_type etc.
Categories
(Developer Infrastructure :: Source Code Analysis, defect)
Developer Infrastructure
Source Code Analysis
Tracking
(Not tracked)
RESOLVED
FIXED
People
(Reporter: mccr8, Assigned: jcranmer)
References
Details
Attachments
(2 files)
703 bytes,
patch
|
Details | Diff | Splinter Review | |
8.32 KB,
patch
|
taras.mozilla
:
review-
|
Details | Diff | Splinter Review |
When running Dehydra on some files on moz-central, I get a ton of console spew:
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:67:1: warning: attribute ignored in declaration of ‘class<unnamed>::TransactionPoolEv\
entTarget’
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:67:1: warning: attribute for ‘class<unnamed>::TransactionPoolEventTarget’ must follow\
the ‘class’ keyword
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp: In constructor ‘std::exception::exception()’:
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_pack_expansion: _ArgTypes ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_pack_expansion: _ArgTypes ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_pack_expansion: _ArgTypes ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_pack_expansion: _ArgTypes ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_pack_expansion: _ArgTypes ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_pack_expansion: _ArgTypes ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_pack_expansion: _ArgTypes ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_pack_expansion: _ArgTypes ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled decltype_type: decltype (((_Tp1)((declval<_Args1>)\
()...), std::__sfinae_types::__one()))
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_argument_pack: _Args ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled decltype_type: decltype ((static_cast<_Tp1>(declva\
l<_Arg1>()), std::__sfinae_types::__one()))
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_argument_pack: _Arg
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_argument_pack: _Args ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_argument_pack: _From
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_argument_pack: _Tp
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_argument_pack: _Tp, _Up
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_argument_pack: _Tp, _Up, _Vp ...
/home/amccreight/tm/dom/indexedDB/AsyncConnectionHelper.cpp:579:1: warning: Dehydra: Unhandled type_argument_pack: _Tp ...
Reporter | ||
Comment 1•13 years ago
|
||
In IRC, jcranmer said this probably means it isn't reifying some structure.
The warning is produced in dehydra_types.c, and is on a default case in a switch on TREE_CODE (type).
Reporter | ||
Comment 2•13 years ago
|
||
TYPE_PACK_EXPANSION is defined in cp/cp-tree.def and "Represents a type expression that will be expanded into a list of types when instantiated with one or more argument packs". TYPE_ARGUMENT_PACK is defined in the same file and "Represents an argument pack of types (or templates)".
I'm not really sure what that means, except that the former sounds like a type-level function, and the latter sounds like an argument for a type level function.
One instance of this I found looks fairly innocuous. There's a method:
unsigned size() const { return descriptors_.size(); }
Where descriptors_ is defined as:
std::vector<base::FileDescriptor> descriptors_;
The class itself doesn't look all that weird, except that it is the subtype of a template.
I'm not really sure how this would be represented in Dehydra, unless it has to cancel out the type abstraction and application somehow and create a template.
Assignee | ||
Comment 3•13 years ago
|
||
Simple test case that doesn't require STL:
template <typename... A> void func(A... args) {}
template <typename... B> class C {};
B... is the type_argument_pack/
A... is the type_pack_expansion.
Assignee | ||
Comment 4•13 years ago
|
||
This also needs to be added to dehydra_types.js and lazy_types.js.
A complete list of the types in gcc-4.6.1 headers and which files handle them:
+---- dehydra_types.c
|+--- libs/unstable/lazy_types.js
||+-- libs/unstable/dehydra_types.js
|||
-- ALL
xxx offset_type
xxx enumeral_type
xxx boolean_type
xxx integer_type
xxx real_type
xxx pointer_type
xxx reference_type
nullptr_type
xxx fixed_point_type
xxx complex_type
xxx vector_type
xxx array_type
xxx record_type
xxx union_type
qual_union_type
xxx void_type
xxx function_type
xxx method_type
lang_type
-- C++
x template_template_parm
xxx template_type_parm
xxx typename_type
xx typeof_type
x bound_template_template_parm
unbound_class_template
type_argument_pack
type_pack_expansion
decltype_type
-- Objective-C
class_interface_type
class_implementation_type
category_interface_type
category_implementation_type
protocol_interface_type
-- Ada
unconstrained_array_type
[Java and C family define no types]
Some notes:
qual_union_type [Similar to UNION_TYPE, except that the expressions in DECL_QUALIFIER in each FIELD_DECL determine what the union contains. The first field whose DECL_QUALIFIER expression is true is deemed to occupy the union.]
lang_type [Unknown type that the front-end has to worry about]
unbound_class_template [For template template argument of the form `T::template C'.]
type_argument_pack [A collection of type arguments]
type_pack_expansion [A type expression that expands into a list of types]
decltype_type [Appears to be C++0x-specified clone of typeof()]
[ I don't care about Objective C or Ada, just listed them for completeness ]
Comment 5•13 years ago
|
||
Assignee | ||
Comment 6•13 years ago
|
||
Apologies, the decltype only appears to be emitted if the type is parameter-dependent, e.g.:
template <typename A, typename B> void f(A x, B y, decltype(x / y) z) {}
Assignee | ||
Comment 7•13 years ago
|
||
This adds support for decltype and variadic templates in dehydra_types.c, lazy_types.js, and dehydra_types.js, at least as near as I can tell.
Attachment #554897 -
Flags: review?(tglek)
Comment 8•13 years ago
|
||
Comment on attachment 554897 [details] [diff] [review]
Adds support for decltype, variadic templates
># HG changeset patch
># Parent 468f253e4ae71c74fae2366619693bac10c38827
>
>diff --git a/dehydra_types.c b/dehydra_types.c
>--- a/dehydra_types.c
>+++ b/dehydra_types.c
>@@ -453,16 +453,19 @@ static jsval dehydra_convert_type_cached
>
> break;
> }
> case COMPLEX_TYPE:
> case VECTOR_TYPE:
> /* maybe should add an isTemplateParam? */
> case TEMPLATE_TYPE_PARM:
> case TYPENAME_TYPE:
>+ case TYPE_ARGUMENT_PACK:
>+ case TYPE_PACK_EXPANSION:
>+ // FIXME: variadic templates need better support
> dehydra_defineStringProperty (this, obj, NAME, dehydra_typeString(type));
> dehydra_defineProperty (this, obj, ISTYPENAME, JSVAL_TRUE);
This is kinda misleading. Feels like isTypename should not be set for these new cases.
> break;
> case FUNCTION_TYPE:
> case METHOD_TYPE:
> dehydra_convertAttachFunctionType (this, obj, type);
> break;
> case ARRAY_TYPE:
>@@ -485,16 +488,17 @@ static jsval dehydra_convert_type_cached
> if (type_name) {
> // what the hell else would a template be?
> xassert (DECL_P (type_name));
> dehydra_defineStringProperty (this, obj, NAME, decl_as_string (type_name, 0));
> break;
> }
> }
> case TYPEOF_TYPE:
>+ case DECLTYPE_TYPE:
> // avoid dealing with typeof mess
> dehydra_defineStringProperty (this, obj, "typeof_not_implemented", type_as_string (type, 0));
Same here. Should not confuse decltype and typeoftype
>+ elif self.lang == 'c++0x':
>+ command += " -std=c++0x"
> command += " -c -fplugin=../gcc_" + self.plugin + ".so -o /dev/null"
> if "PLUGINS_MOZ" in config_opts:
> command += ' -fplugin-arg="' + self.jsfile
> argprefix = "--"
> else :
> command += " -fplugin-arg-gcc_" + self.plugin + "-script=" + self.jsfile
> argprefix = "-fplugin-arg-gcc_" + self.plugin + "-"
> for key, value in self.arguments.iteritems():
>@@ -182,29 +184,26 @@ def extractTests(filename):
> arguments = spec.get('args')
> if arguments is None:
> arguments = {}
>
> langs = spec.get('lang')
> if langs is None:
> langs = 'c,c++'
> # ignore C tests if C is not enabled
>- if not 'C_SUPPORT' in config_opts:
>- # ignore C only tests
>- if langs == 'c':
>- return []
>- # use only C++ for multiplatform tests
>- langs = 'c++'
>+ supported = set(['c++', 'c++0x'])
>+ if 'C_SUPPORT' in config_opts:
>+ supported.update('c')
> langs = langs.split(',')
> for lang in langs:
>- if lang not in ('c', 'c++'):
>+ if lang not in ('c', 'c++', 'c++0x'):
not you mean if lang not in supported?
Rest is good work
Attachment #554897 -
Flags: review?(tglek) → review-
Assignee | ||
Comment 9•13 years ago
|
||
(In reply to Taras Glek (:taras) from comment #8)
> Comment on attachment 554897 [details] [diff] [review]
> Adds support for decltype, variadic templates
>
> ># HG changeset patch
> ># Parent 468f253e4ae71c74fae2366619693bac10c38827
> >
> >diff --git a/dehydra_types.c b/dehydra_types.c
> >--- a/dehydra_types.c
> >+++ b/dehydra_types.c
> >@@ -453,16 +453,19 @@ static jsval dehydra_convert_type_cached
> >
> > break;
> > }
> > case COMPLEX_TYPE:
> > case VECTOR_TYPE:
> > /* maybe should add an isTemplateParam? */
> > case TEMPLATE_TYPE_PARM:
> > case TYPENAME_TYPE:
> >+ case TYPE_ARGUMENT_PACK:
> >+ case TYPE_PACK_EXPANSION:
> >+ // FIXME: variadic templates need better support
> > dehydra_defineStringProperty (this, obj, NAME, dehydra_typeString(type));
> > dehydra_defineProperty (this, obj, ISTYPENAME, JSVAL_TRUE);
>
> This is kinda misleading. Feels like isTypename should not be set for these
> new cases.
As far as I can tell, the isTypename is more or less just an attribute which says "this is a template typename parameter", which the variadic pack types certainly are.
> > case TYPEOF_TYPE:
> >+ case DECLTYPE_TYPE:
> > // avoid dealing with typeof mess
> > dehydra_defineStringProperty (this, obj, "typeof_not_implemented", type_as_string (type, 0));
>
> Same here. Should not confuse decltype and typeoftype
As far as I can figure out, typeof and decltype are the same thing; gcc tells me to use decltype instead of typeof if you use typeof with -std=c++0x.
> >- if lang not in ('c', 'c++'):
> >+ if lang not in ('c', 'c++', 'c++0x'):
>
> not you mean if lang not in supported?
If ENABLE_C_SUPPORT is not enabled, this would throw an error.
Comment 10•13 years ago
|
||
(In reply to Joshua Cranmer [:jcranmer] from comment #9)
> (In reply to Taras Glek (:taras) from comment #8)
> > Comment on attachment 554897 [details] [diff] [review]
> > Adds support for decltype, variadic templates
> >
> > ># HG changeset patch
> > ># Parent 468f253e4ae71c74fae2366619693bac10c38827
> > >
> > >diff --git a/dehydra_types.c b/dehydra_types.c
> > >--- a/dehydra_types.c
> > >+++ b/dehydra_types.c
> > >@@ -453,16 +453,19 @@ static jsval dehydra_convert_type_cached
> > >
> > > break;
> > > }
> > > case COMPLEX_TYPE:
> > > case VECTOR_TYPE:
> > > /* maybe should add an isTemplateParam? */
> > > case TEMPLATE_TYPE_PARM:
> > > case TYPENAME_TYPE:
> > >+ case TYPE_ARGUMENT_PACK:
> > >+ case TYPE_PACK_EXPANSION:
> > >+ // FIXME: variadic templates need better support
> > > dehydra_defineStringProperty (this, obj, NAME, dehydra_typeString(type));
> > > dehydra_defineProperty (this, obj, ISTYPENAME, JSVAL_TRUE);
> >
> > This is kinda misleading. Feels like isTypename should not be set for these
> > new cases.
>
> As far as I can tell, the isTypename is more or less just an attribute which
> says "this is a template typename parameter", which the variadic pack types
> certainly are.
>
> > > case TYPEOF_TYPE:
> > >+ case DECLTYPE_TYPE:
> > > // avoid dealing with typeof mess
> > > dehydra_defineStringProperty (this, obj, "typeof_not_implemented", type_as_string (type, 0));
> >
> > Same here. Should not confuse decltype and typeoftype
>
> As far as I can figure out, typeof and decltype are the same thing; gcc
> tells me to use decltype instead of typeof if you use typeof with -std=c++0x.
Change it to "typeof/decltype_not_implemented" and r+ on the rest
Assignee | ||
Comment 11•13 years ago
|
||
Changed the decltype thing and pushed the rest.
Assignee: nobody → Pidgeot18
Status: NEW → RESOLVED
Closed: 13 years ago
Resolution: --- → FIXED
Updated•7 years ago
|
Product: Core → Firefox Build System
Updated•2 years ago
|
Product: Firefox Build System → Developer Infrastructure
You need to log in
before you can comment on or make changes to this bug.
Description
•