Commit 3f2d352c by Paolo Carlini Committed by Paolo Carlini

re PR c++/57942 (g++-4.8.1 tries to instantiate wrong constructor)

/cp
2013-07-24  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/57942
	* typeck.c (ptr_reasonably_similar): Use COMPARE_STRICT if one of
	the target types is incomplete; return a bool, not an int.
	* cp-tree.h (ptr_reasonably_similar): Adjust declaration.

/testsuite
2013-07-24  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/57942
	* g++.dg/inherit/pr57942.C: New.

From-SVN: r201201
parent a5f257fd
2013-07-24 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57942
* typeck.c (ptr_reasonably_similar): Use COMPARE_STRICT if one of
the target types is incomplete; return a bool, not an int.
* cp-tree.h (ptr_reasonably_similar): Adjust declaration.
2013-07-22 Paolo Carlini <paolo.carlini@oracle.com> 2013-07-22 Paolo Carlini <paolo.carlini@oracle.com>
* cp-tree.h (DERIVED_FROM_P): Pass tf_none to lookup_base, not * cp-tree.h (DERIVED_FROM_P): Pass tf_none to lookup_base, not
......
...@@ -6022,7 +6022,7 @@ extern tree convert_for_initialization (tree, tree, tree, int, ...@@ -6022,7 +6022,7 @@ extern tree convert_for_initialization (tree, tree, tree, int,
extern int comp_ptr_ttypes (tree, tree); extern int comp_ptr_ttypes (tree, tree);
extern bool comp_ptr_ttypes_const (tree, tree); extern bool comp_ptr_ttypes_const (tree, tree);
extern bool error_type_p (const_tree); extern bool error_type_p (const_tree);
extern int ptr_reasonably_similar (const_tree, const_tree); extern bool ptr_reasonably_similar (const_tree, const_tree);
extern tree build_ptrmemfunc (tree, tree, int, bool, extern tree build_ptrmemfunc (tree, tree, int, bool,
tsubst_flags_t); tsubst_flags_t);
extern int cp_type_quals (const_tree); extern int cp_type_quals (const_tree);
......
...@@ -8599,10 +8599,10 @@ error_type_p (const_tree type) ...@@ -8599,10 +8599,10 @@ error_type_p (const_tree type)
} }
} }
/* Returns 1 if to and from are (possibly multi-level) pointers to the same /* Returns true if to and from are (possibly multi-level) pointers to the same
type or inheritance-related types, regardless of cv-quals. */ type or inheritance-related types, regardless of cv-quals. */
int bool
ptr_reasonably_similar (const_tree to, const_tree from) ptr_reasonably_similar (const_tree to, const_tree from)
{ {
for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from)) for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
...@@ -8614,7 +8614,7 @@ ptr_reasonably_similar (const_tree to, const_tree from) ...@@ -8614,7 +8614,7 @@ ptr_reasonably_similar (const_tree to, const_tree from)
return !error_type_p (to); return !error_type_p (to);
if (TREE_CODE (to) != TREE_CODE (from)) if (TREE_CODE (to) != TREE_CODE (from))
return 0; return false;
if (TREE_CODE (from) == OFFSET_TYPE if (TREE_CODE (from) == OFFSET_TYPE
&& comptypes (TYPE_OFFSET_BASETYPE (to), && comptypes (TYPE_OFFSET_BASETYPE (to),
...@@ -8624,19 +8624,24 @@ ptr_reasonably_similar (const_tree to, const_tree from) ...@@ -8624,19 +8624,24 @@ ptr_reasonably_similar (const_tree to, const_tree from)
if (TREE_CODE (to) == VECTOR_TYPE if (TREE_CODE (to) == VECTOR_TYPE
&& vector_types_convertible_p (to, from, false)) && vector_types_convertible_p (to, from, false))
return 1; return true;
if (TREE_CODE (to) == INTEGER_TYPE if (TREE_CODE (to) == INTEGER_TYPE
&& TYPE_PRECISION (to) == TYPE_PRECISION (from)) && TYPE_PRECISION (to) == TYPE_PRECISION (from))
return 1; return true;
if (TREE_CODE (to) == FUNCTION_TYPE) if (TREE_CODE (to) == FUNCTION_TYPE)
return !error_type_p (to) && !error_type_p (from); return !error_type_p (to) && !error_type_p (from);
if (!TYPE_PTR_P (to)) if (!TYPE_PTR_P (to))
return comptypes {
(TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from), /* When either type is incomplete avoid DERIVED_FROM_P,
COMPARE_BASE | COMPARE_DERIVED); which may call complete_type (c++/57942). */
bool b = !COMPLETE_TYPE_P (to) || !COMPLETE_TYPE_P (from);
return comptypes
(TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
b ? COMPARE_STRICT : COMPARE_BASE | COMPARE_DERIVED);
}
} }
} }
......
2013-07-24 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57942
* g++.dg/inherit/pr57942.C: New.
2013-07-23 Michael Meissner <meissner@linux.vnet.ibm.com> 2013-07-23 Michael Meissner <meissner@linux.vnet.ibm.com>
* gcc.target/powerpc/bool2.h: New file, test the code generation * gcc.target/powerpc/bool2.h: New file, test the code generation
......
// PR c++/57942
template<typename T> struct S { typename T::error type; };
struct X {};
void f(S<int>*);
void f(...);
void g() { f((X*)0); }
struct Y;
void h() { f((Y*)0); }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment