* cp-tree.h (grok_enum_decls): Remove type parameter.
* decl.c (grok_enum_decls): Likewise.
* decl2.c (grok_x_components): Call grok_enum_decls
unconditionally, since it will do nothing if there is no
current_local_enum. Use the new calling sequence.
* pt.c (tsubst_enum): Use the new calling sequence for
grok_enum_decls.
* decl.c (start_function): Make member functions of local classes
in extern inline functions have comdat linkage here...
(grokdeclarator): Rather than here.
* pt.c (convert_nontype_argument): Use decl_constant_value.
From-SVN: r17531
+Wed Jan 28 11:04:07 1998 Mark Mitchell <mmitchell@usa.net>
+
+ * cp-tree.h (grok_enum_decls): Remove type parameter.
+ * decl.c (grok_enum_decls): Likewise.
+ * decl2.c (grok_x_components): Call grok_enum_decls
+ unconditionally, since it will do nothing if there is no
+ current_local_enum. Use the new calling sequence.
+ * pt.c (tsubst_enum): Use the new calling sequence for
+ grok_enum_decls.
+
+ * decl.c (start_function): Make member functions of local classes
+ in extern inline functions have comdat linkage here...
+ (grokdeclarator): Rather than here.
+
+Wed Jan 28 10:55:47 1998 Jason Merrill <jason@yorick.cygnus.com>
+
+ * pt.c (convert_nontype_argument): Use decl_constant_value.
+
Tue Jan 27 16:42:21 1998 Mark Mitchell <mmitchell@usa.net>
* call.c (add_template_candidate_real): New function.
(check_explicit_specialization): Return a tree, not an int.
(more_specialized): Take additional argument.
(get_bindings): Likewise.
+ (TI_PENDING_SPECIALIZATION_FLAG): New macro.
* cvt.c (perform_qualification_conversions): Use comp_ptr_ttypes.
(perform_array_to_pointer_conversion): Remove.
* decl.c (saved_scope): Add processing_specialization,
extern tree start_enum PROTO((tree));
extern tree finish_enum PROTO((tree, tree));
extern tree build_enumerator PROTO((tree, tree));
-extern tree grok_enum_decls PROTO((tree, tree));
+extern tree grok_enum_decls PROTO((tree));
extern int start_function PROTO((tree, tree, tree, int));
extern void expand_start_early_try_stmts PROTO((void));
extern void store_parm_decls PROTO((void));
funcdef_flag, template_count);
if (decl == NULL_TREE)
return NULL_TREE;
- if (function_context != NULL_TREE
- && DECL_THIS_INLINE (function_context)
- && TREE_PUBLIC (function_context))
- /* We just declared a member of a local class in an
- extern inline function. Give such an entity comdat
- linkage. */
- {
- comdat_linkage (decl);
- DECL_INTERFACE_KNOWN (decl) = 1;
- }
#if 0
/* This clobbers the attrs stored in `decl' from `attrlist'. */
/* The decl and setting of decl_machine_attr is also turned off. */
}
tree
-grok_enum_decls (type, decl)
- tree type, decl;
+grok_enum_decls (decl)
+ tree decl;
{
tree d = current_local_enum;
while (1)
{
- TREE_TYPE (d) = type;
if (TREE_CHAIN (d) == NULL_TREE)
{
TREE_CHAIN (d) = decl;
if (DECL_INTERFACE_KNOWN (decl1))
{
+ tree ctx = hack_decl_function_context (decl1);
+
if (DECL_NOT_REALLY_EXTERN (decl1))
DECL_EXTERNAL (decl1) = 0;
+
+ if (ctx != NULL_TREE && DECL_THIS_INLINE (ctx)
+ && TREE_PUBLIC (ctx))
+ /* This is a function in a local class in an extern inline
+ function. */
+ comdat_linkage (decl1);
}
/* If this function belongs to an interface, it is public.
If it belongs to someone else's interface, it is also external.
break;
}
else if (TREE_CODE (t) == ENUMERAL_TYPE)
- x = grok_enum_decls (t, NULL_TREE);
+ x = grok_enum_decls (NULL_TREE);
else
x = NULL_TREE;
return x;
}
}
else
- {
- t = TREE_TYPE (components);
- if (TREE_CODE (t) == ENUMERAL_TYPE && TREE_NONLOCAL_FLAG (t))
- return grok_enum_decls (t, components);
- else
- return components;
- }
+ /* There may or may not be any enum decls to grok, but
+ grok_enum_decls will just return components, if there aren't
+ any. We used to try to figure out whether or not there were
+ any enum decls based on the type of components, but that's too
+ hard; it might be something like `enum { a } *p;'. */
+ return grok_enum_decls (components);
}
/* Classes overload their constituent function names automatically.
--the name of an object or function with external linkage,
including function templates and function template-ids but
- excluding non- tatic class members, expressed as id-expression;
+ excluding non-static class members, expressed as id-expression;
or
--the address of an object or function with external linkage,
--a pointer to member expressed as described in _expr.unary.op_. */
+ /* An integral constant-expression can include const variables
+ or enumerators. */
+ if (INTEGRAL_TYPE_P (expr_type) && TREE_READONLY_DECL_P (expr))
+ expr = decl_constant_value (expr);
+
if (INTEGRAL_TYPE_P (expr_type)
|| TYPE_PTRMEM_P (expr_type)
|| TYPE_PTRMEMFUNC_P (expr_type))
{
- if (!TREE_CONSTANT (expr)
- /* FIXME: Should this case be handled by fold()? Why not? */
- && !(TREE_CODE (expr) == VAR_DECL && TREE_READONLY (expr)))
+ if (! TREE_CONSTANT (expr))
{
cp_error ("non-constant `%E' cannot be used as template argument",
expr);
finish_enum (newtag, values);
if (NULL != field_chain)
- *field_chain = grok_enum_decls (newtag, NULL_TREE);
+ *field_chain = grok_enum_decls (NULL_TREE);
current_local_enum = prev_local_enum;